MyISAM obsługuje to zachowanie. Utwórz dwukolumnowy klucz podstawowy i zrób drugi autoinkrementacja kolumny. Zacznie się od nowa dla każdej odrębnej wartości w pierwszej kolumnie.
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 jeśli się nad tym zastanowisz, jest to bezpieczne tylko dla wątków w silniku pamięci masowej, który wykonuje blokowanie na poziomie tabeli dla instrukcji INSERT. Ponieważ INSERT musi przeszukać inne wiersze w tabeli, aby znaleźć maks. j
wartość dla tego samego i
wartość. Jeśli inne osoby wykonują INSERT jednocześnie, tworzy to sytuację wyścigową.
Tak więc zależność od MyISAM, który blokuje na poziomie tabeli na INSERT.
Zobacz ten odnośnik w instrukcji:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html w sekcji MyISAM Notes .
Istnieje wiele dobrych powodów, aby nie używać MyISAM. Decydującym czynnikiem jest dla mnie skłonność MyISAM do uszkadzania danych.
Odpowiedz na swój komentarz:
InnoDB nie obsługuje opisanego powyżej zachowania przyrostu na grupę. Możesz utworzyć wielokolumnowy klucz podstawowy, ale wystąpił błąd, ponieważ InnoDB wymaga, aby kolumna autoinkrementacji była pierwszą kolumną w kluczu tabeli (nie musi to być ściśle klucz podstawowy)
Niezależnie od pozycji kolumny auto-inkrementacji w kluczu wielokolumnowym, zwiększa się ona tylko wtedy, gdy używasz jej z InnoDB; nie numeruje wpisów według odrębnej wartości w innej kolumnie.
Aby to zrobić z tabelą InnoDB, musisz jawnie zablokować tabelę na czas trwania INSERT, aby uniknąć sytuacji wyścigu. Możesz wykonać własne zapytanie SELECT dla maksymalnej wartości w grupie, do której wstawiasz. Następnie wstaw tę wartość + 1.
Zasadniczo musisz ominąć funkcję automatycznego zwiększania i określić wartości, zamiast generować je automatycznie.