Portál AbcLinuxu, 10. května 2025 14:18
mysql> SELECT @@SESSION.sql_mode; +----------------------------------------------------------------+ | @@SESSION.sql_mode | +----------------------------------------------------------------+ | STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +----------------------------------------------------------------+ 1 row in set (0.00 sec) mysql> CREATE TABLE tfull ( -> id INT NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id) -> ) ENGINE=InnoDB AUTO_INCREMENT = 2147483647; Query OK, 0 rows affected (0.01 sec) mysql> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.00 sec) mysql> INSERT INTO tfull VALUES(); ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY' mysql> DROP TABLE tfull; Query OK, 0 rows affected (0.01 sec) mysql>Ale řekl bych, že chyba může být i jiného typu...
MariaDB [test]> CREATE TABLE tfull ( -> id INT NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id) -> ) ENGINE=InnoDB AUTO_INCREMENT = 2147483647; Query OK, 0 rows affected (0.06 sec) MariaDB [test]> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.06 sec) MariaDB [test]> INSERT INTO tfull VALUES(); ERROR 167 (22003): Out of range value for column 'id' at row 1 MariaDB [test]> alter table tfull modify id BIGINT; Query OK, 1 row affected (0.06 sec) Records: 1 Duplicates: 0 Warnings: 0 MariaDB [test]> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.05 sec) MariaDB [test]> DROP TABLE tfull; Query OK, 0 rows affected (0.06 sec)
Měl jsi si skusit ten insert provést 2×, pak by jsi si zjistil, že jsi problém nevyřešil, jen jsi vytvořil jiný (na to přijdeš hned, takže ho neodhalím ).
A když už jsme u MySQL(MariaDB) a zvolili jsme na začátku INT a ne BIGINT, tak možná je lepší postup viz níže, protože (teoreticky) 2× natáhneme čas dokud nám stačí 32 bit id a tabulka je výrazně menší rychlejší a nepotřebuje tolik paměti (pokud interval po naplnění byl měsíc, tak to nemá význam, ale pokud třeba tři roky, tak je to dost zásadní).
Já bych postupoval v tomto případě z mezikrokem takto:
mysql> CREATE TABLE tfull ( -> id INT NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id) -> ) ENGINE=InnoDB AUTO_INCREMENT = 2147483647; Query OK, 0 rows affected (0.02 sec) mysql> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.02 sec) mysql> INSERT INTO tfull VALUES(); ERROR 1062 (23000): Duplicate entry '2147483647' for key 'PRIMARY' mysql> ALTER TABLE tfull MODIFY id INT UNSIGNED auto_increment; Query OK, 1 row affected (0.03 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.02 sec) mysql> ALTER TABLE tfull AUTO_INCREMENT = 4294967295; Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0 mysql> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.02 sec) mysql> INSERT INTO tfull VALUES(); ERROR 1062 (23000): Duplicate entry '4294967295' for key 'PRIMARY' mysql> ALTER TABLE tfull MODIFY id BIGINT auto_increment; Query OK, 4 rows affected (0.02 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.01 sec) mysql> INSERT INTO tfull VALUES(); Query OK, 1 row affected (0.02 sec) mysql> SELECT id FROM tfull; +------------+ | id | +------------+ | 2147483647 | | 2147483648 | | 2147483649 | | 4294967295 | | 4294967296 | | 4294967297 | +------------+ 6 rows in set (0.00 sec) mysql> DROP TABLE tfull; Query OK, 0 rows affected (0.01 sec) mysql>
Při milionu insertů za sekundu bude třeba 300tisíc let prp dosažení 9223372036854775807 (BIGINT max.).
A případné zpracování takové hodnoty/typu (BIGINT UNSIGNED) způsobuje jen (drobné) problémy ve většině jazyků a i v samotném MySQL se už musí s tímto číslem pracovat s přetypováním (implicitní konverze čísel, zjednodušeně funguje jen do rozsahu BIGINT).
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.