sql >> Databáze >  >> RDS >> Mysql

cyklický autoinkrement pro každou hodnotu klíče

MyISAM toto chování podporuje. Vytvořte primární klíč se dvěma sloupci a vytvořte druhý automatický přírůstek sloupce. Začne znovu pro každou odlišnou hodnotu v prvním sloupci.

CREATE TABLE t (i INT, j INT AUTO_INCREMENT, PRIMARY KEY (i,j)) ENGINE=MyISAM;
INSERT INTO t (i) VALUES (1), (1), (2), (2), (1), (3);
SELECT * FROM t; 

+---+---+
| i | j |
+---+---+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 2 |
| 3 | 1 |
+---+---+

Ale když se nad tím zamyslíte, je to bezpečné pro vlákna pouze u úložiště, které provádí uzamykání na úrovni tabulky pro příkazy INSERT. Protože INSERT musí prohledat další řádky v tabulce, aby našel maximální j hodnotu za stejný i hodnota. Pokud jiní lidé provádějí INSERT souběžně, vytvoří to podmínku závodu.

Tedy závislost na MyISAM, který provádí zamykání na úrovni tabulky na INSERT.

Viz tento odkaz v příručce:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html v části Poznámky MyISAM .

Existuje celá řada dobrých důvodů, proč nepoužívat MyISAM. Rozhodujícím faktorem je pro mě tendence MyISAM poškozovat data.

K vašemu komentáři:

InnoDB nepodporuje výše popsané chování přírůstků na skupinu. Můžete vytvořit primární klíč s více sloupci, ale došlo k chybě, protože InnoDB vyžaduje, aby sloupec automatického přírůstku byl prvním sloupcem v klíči tabulky (nemusí to být nutně primární klíč)

Bez ohledu na pozici sloupce automatického zvýšení ve vícesloupcovém klíči se zvýší pouze tehdy, když jej použijete s InnoDB; nečísluje položky na odlišnou hodnotu v jiném sloupci.

Chcete-li to provést s tabulkou InnoDB, museli byste tabulku explicitně zamknout na dobu trvání INSERT, abyste se vyhnuli podmínkám závodu. Udělali byste svůj vlastní dotaz SELECT pro maximální hodnotu ve skupině, do které vkládáte. Poté vložte tuto hodnotu + 1.

V zásadě musíte obejít funkci automatického přírůstku a zadat hodnoty místo toho, abyste je nechali automaticky generovat.



  1. Docker - PG::ConnectionBad

  2. chyba nebo chyba zámku mysql?

  3. Auditování PostgreSQL pomocí pgAudit

  4. MySQL 5.7.5+ získá první řádek pro skupiny