MyISAM ondersteunt dit gedrag. Maak een primaire sleutel met twee kolommen en maak de tweede kolom automatisch verhogen. Het begint opnieuw voor elke afzonderlijke waarde in de eerste kolom.
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 |
+---+---+
Maar als je erover nadenkt, is dit alleen thread-safe in een opslagengine die vergrendeling op tafelniveau doet voor INSERT-instructies. Omdat de INSERT andere rijen in de tabel moet doorzoeken om de max j
. te vinden waarde per dezelfde i
waarde. Als andere mensen gelijktijdig INSERT's doen, ontstaat er een raceconditie.
Dus de afhankelijkheid van MyISAM, die vergrendeling op tabelniveau uitvoert op INSERT.
Zie deze referentie in de handleiding:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html onder de sectie, MijnISAM-opmerkingen .
Er zijn een heleboel goede redenen om MyISAM niet te gebruiken. De beslissende factor voor mij is de neiging van MyISAM om gegevens te corrumperen.
Over uw opmerking:
InnoDB ondersteunt het hierboven beschreven increment-per-group-gedrag niet. U kunt een primaire sleutel met meerdere kolommen maken, maar de fout die u krijgt, is omdat InnoDB vereist dat de kolom voor automatisch verhogen de eerste kolom in een sleutel van de tabel is (het hoeft niet strikt de primaire sleutel te zijn)
Ongeacht de positie van de kolom voor automatisch verhogen in de toets met meerdere kolommen, wordt deze alleen verhoogd wanneer u deze gebruikt met InnoDB; het nummert geen items per afzonderlijke waarde in een andere kolom.
Om dit te doen met een InnoDB-tabel, moet u de tabel expliciet vergrendelen voor de duur van de INSERT, om race-omstandigheden te voorkomen. U zou uw eigen SELECT-query doen voor de maximale waarde in de groep waarin u invoegt. Voer vervolgens die waarde in + 1.
Kortom, u moet de functie voor automatisch verhogen omzeilen en waarden opgeven in plaats van ze automatisch te laten genereren.