Portál AbcLinuxu, 5. listopadu 2025 12:42
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.