sql >> Databasteknik >  >> RDS >> Mysql

cyklisk autoinkrement för varje nyckelvärde

MyISAM stöder detta beteende. Skapa en primärnyckel med två kolumner och gör den andra automatisk ökning av kolumnen. Det börjar om för varje distinkt värde i den första kolumnen.

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 |
+---+---+

Men om du tänker efter så är detta bara trådsäkert i en lagringsmotor som gör bordsnivålåsning för INSERT-satser. Eftersom INSERT måste söka efter andra rader i tabellen för att hitta max j värde per samma i värde. Om andra personer gör INSERT samtidigt skapar det ett tävlingstillstånd.

Alltså beroendet av MyISAM, som gör låsning på tabellnivå på INSERT.

Se denna referens i manualen:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html under avsnittet MyISAM Notes .

Det finns många bra skäl att inte använda MyISAM. Den avgörande faktorn för mig är MyISAM:s tendens att korrumpera data.

Angående din kommentar:

InnoDB stöder inte beteendet med steg per grupp som beskrivs ovan. Du kan skapa en primärnyckel med flera kolumner, men felet du fick beror på att InnoDB kräver att kolumnen för autoinkrement är den första kolumnen i en nyckel i tabellen (det behöver strikt inte vara primärnyckeln)

Oavsett positionen för den automatiska inkrementkolumnen i flerkolumnnyckeln, ökar den bara när du använder den med InnoDB; den numrerar inte poster per distinkt värde i en annan kolumn.

För att göra detta med en InnoDB-tabell, måste du låsa tabellen explicit under INSERT-perioden, för att undvika tävlingsförhållanden. Du skulle göra din egen SELECT-fråga för maxvärdet i gruppen du infogar i. Sätt sedan in det värdet + 1.

I grund och botten måste du kringgå funktionen för automatisk ökning och ange värden istället för att de ska genereras automatiskt.



  1. hur man tar bort dubbletter i mysql med hjälp av case

  2. Oracle-fråga för att få ett visst datum

  3. Kan jag slå samman två tabeller där den sammanfogade tabellen sorteras efter en viss kolumn?

  4. ORACLE Castar DATUM till TIDSTÄMPEL MED TIDZON MED OFFSET