Mysql
 sql >> Baza danych >  >> RDS >> Mysql

cykliczny autoinkrement dla każdej wartości klucza

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql - wyszukiwanie między datami, w których pojawiają się wszystkie daty

  2. Wstawianie danych tablicy formularzy do MySQL za pomocą PHP

  3. Rozmiar bazy danych inny po eksporcie/importu

  4. Powiadomić użytkownika o zmianie bazy danych? JavaScript/AJAX

  5. Wstaw natychmiast dane do tabeli, które zostaną pobrane z polecenia wyboru mySQL