Portál AbcLinuxu, 27. dubna 2024 02:21


Dotaz: MySQL a AI

13.3.2014 13:37 LuRy | skóre: 12
MySQL a AI
Přečteno: 406×
Odpovědět | Admin
Zdravim, zajimalo by me co se stane kdyz dojdou(pretecou) hodnoty int(11) sloupce na kterym je primarni klic a autoincrement? Za predpokladu ze 90% z "preskocenych" id nebudou vubec existovat? Mam totiz tabulku do ktery zapisuju data tak ze 3 sloupce maji unikatni klic a pri vlozeni duplicitniho radku na zaklade tohoto uniq klice odchatavam vyjimku. Nicmene zpusobuje to to ze se preskakuji id.

Diky za odpovedi
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Tarmaq avatar 13.3.2014 15:34 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: MySQL a AI
Odpovědět | | Sbalit | Link | Blokovat | Admin
Spadne ti to, Machale..
Don't panic!
13.3.2014 16:06 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: MySQL a AI
Odpovědět | | Sbalit | Link | Blokovat | Admin
Si to zkus, už nevložíš.
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...
To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
13.3.2014 16:12 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: MySQL a AI
ale řešení je naštěstí nasnadě:
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)
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.
13.3.2014 18:39 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: MySQL a AI

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> 

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†
14.3.2014 08:34 blondak | skóre: 36 | blog: Blondak | Čáslav
Rozbalit Rozbalit vše Re: MySQL a AI
Njn, zapomenutý AUTO_INCREMENT a když jsme u toho, tak lze to UNSIGNED použít i u BIGINT ;)
Každý problém ma své logické, snadno pochopitelné nesprávné řešení.
14.3.2014 10:35 Šangala | skóre: 56 | blog: Dutá Vrba - Wally
Rozbalit Rozbalit vše Re: MySQL a AI

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).

To, že trpíš stihomamem, ještě neznamená, že po tobě nejdou. ⰞⰏⰉⰓⰀⰜⰉ ⰗⰞⰅⰜⰘ ⰈⰅⰏⰉ ⰒⰑⰎⰉⰁⰕⰅ ⰏⰉ ⰒⰓⰄⰅⰎ ·:⁖⁘⁙†

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.