MyISAM understøtter denne adfærd. Opret en primærnøgle med to kolonner, og lav den anden automatisk stigning i kolonnen. Den starter forfra for hver enkelt værdi i den første kolonne.
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 hvis du tænker over det, er dette kun trådsikkert i en lagermotor, der bord-niveaulåsning for INSERT-udsagn. Fordi INSERT skal søge i andre rækker i tabellen for at finde max j
værdi for samme i
værdi. Hvis andre mennesker laver INSERT samtidigt, skaber det en race-tilstand.
Altså afhængigheden af MyISAM, som laver tabelniveaulåsning på INSERT.
Se denne reference i manualen:http:// dev.mysql.com/doc/refman/5.6/en/example-auto-increment.html under afsnittet MyISAM-noter .
Der er en hel masse gode grunde til ikke at bruge MyISAM. Den afgørende faktor for mig er MyISAMs tendens til at korrupte data.
Om din kommentar:
InnoDB understøtter ikke trin-per-gruppe-adfærden beskrevet ovenfor. Du kan lave en primærnøgle med flere kolonner, men fejlen du fik er, fordi InnoDB kræver, at kolonnen med automatisk stigning er den første kolonne i en nøgle i tabellen (det behøver strengt taget ikke at være den primære nøgle)
Uanset positionen af auto-increment-kolonnen i multi-column-nøglen, stiger den kun, når du bruger den med InnoDB; den nummererer ikke indtastninger pr. særskilt værdi i en anden kolonne.
For at gøre dette med en InnoDB-tabel, skal du låse bordet eksplicit i INSERT'ens varighed for at undgå løbsforhold. Du skal lave din egen SELECT-forespørgsel for den maksimale værdi i den gruppe, du indsætter i. Indsæt derefter værdien + 1.
Dybest set er du nødt til at omgå den automatiske stigningsfunktion og angive værdier i stedet for at få dem genereret automatisk.