sql >> Database teknologi >  >> RDS >> Mysql

cyklisk autoincrement for hver nøgleværdi

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.



  1. Isoleret lagerundtagelse:Kan ikke bestemme domænets identitet

  2. Har brug for hjælp til at forbinde min App Engine PHP med min Google Cloud SQL-database

  3. Foto upload CodeIgniter

  4. MySQL:Ugyldig standardværdi for TIMESTAMP