MySQL AUTO_INCREMENT med eksempler
โก Smart opsummering
MySQL AUTO_INCREMENT genererer automatisk fortlรธbende tal for en numerisk kolonne, hver gang en rรฆkke indsรฆttes. Attributten fjerner behovet for at beregne unikke identifikatorer manuelt, hvilket gรธr det til standardmรฅden at udfylde en primรฆrnรธgle.

Hvad er automatisk stigning?
Auto Increment er en funktion, der fungerer pรฅ numeriske datatyper. Den genererer automatisk sekventielle numeriske vรฆrdier, hver gang en post indsรฆttes i en tabel for et felt, der er defineret som automatisk stigning.
Attributten fungerer pรฅ alle heltalstyper, fra TINYINT til BIGINT. Kolonnen skal ogsรฅ indekseres, hvilket sker automatisk, nรฅr den erklรฆres som primรฆrnรธgle.
Hvornรฅr bruger du automatisk stigning?
I lektionen om database normalisering, sรฅ vi pรฅ, hvordan data kan lagres med minimal redundans ved at lagre data i mange smรฅ tabeller, der er relateret til hinanden ved hjรฆlp af primรฆre og fremmednรธgler.
En primรฆrnรธgle skal vรฆre unik, da den entydigt identificerer en rรฆkke i en database. Men hvordan kan vi sikre, at primรฆrnรธglen altid er unik?
En af de mulige lรธsninger ville vรฆre at bruge en formel til at generere den primรฆre nรธgle, som kontrollerer, om nรธglen findes i tabellen, fรธr data tilfรธjes. Dette kan virke, men fremgangsmรฅden er kompleks og ikke idiotsikker. To sessioner, der indsรฆttes pรฅ samme tidspunkt, kan stadig lรฆse den samme maksimale vรฆrdi og kollidere.
For at undgรฅ en sรฅdan kompleksitet, og for at sikre at primรฆrnรธglen altid er unik, kan vi bruge MySQL Funktionen til automatisk forรธgelse til at generere primรฆrnรธgler. Automatisk forรธgelse bruges med datatypen INT. Datatypen INT understรธtter bรฅde signerede og usignerede vรฆrdier. Usignerede datatyper kan kun indeholde positive tal. Som bedste praksis anbefales det at definere den usignerede begrรฆnsning pรฅ den automatiske forรธgelsesprimรฆrnรธgle.
Automatisk stigningssyntaks
Nรฅr du har afklaret rรฆsonnementet, kan du se pรฅ det manuskript, der blev brugt til at oprette tabellen med filmkategorier.
CREATE TABLE `categories` ( `category_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `category_name` varchar(150) DEFAULT NULL, `remarks` varchar(500) DEFAULT NULL, PRIMARY KEY (`category_id`) );
Bemรฆrk "AUTO_INCREMENT" i feltet category_id. Dette forรฅrsager, at kategori-id'et genereres automatisk, hver gang en ny rรฆkke indsรฆttes i tabellen. Det angives ikke, nรฅr data indsรฆttes i tabellen. MySQL genererer det.
Bemรฆrk: Nรธgleordet UNSIGNED fordobler kolonnens positive omrรฅde, og visningsbredden, nรฅr den er skrevet som int(11), er udfaset fra MySQL 8.0.17 og fremefter. Almindelig int er den nuvรฆrende form.
Som standard er startvรฆrdien for AUTO_INCREMENT 1, og den รธges med 1 for hver ny post.
Lad os undersรธge det nuvรฆrende indhold af kategoritabellen.
SELECT * FROM `categories`;
Udfรธrelse af ovenstรฅende script i MySQL Workbench mod myflixdb giver os fรธlgende resultater.
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
Der findes otte rรฆkker, sรฅ det nรฆste genererede id skal vรฆre 9. Lad os nu indsรฆtte en ny kategori i kategoritabellen, hvor vi kun angiver navnet.
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
Udfรธrelse af ovenstรฅende script mod myflixdb in MySQL arbejdsbord giver os fรธlgende resultater vist nedenfor.
| category_id | category_name | remarks |
|---|---|---|
| 1 | Comedy | Movies with humour |
| 2 | Romantic | Love stories |
| 3 | Epic | Story acient movies |
| 4 | Horror | NULL |
| 5 | Science Fiction | NULL |
| 6 | Thriller | NULL |
| 7 | Action | NULL |
| 8 | Romantic Comedy | NULL |
| 9 | Cartoons | NULL |
Bemรฆrk, at vi ikke har angivet kategori-id'et. MySQL genererede det automatisk, fordi kategori-id'et er defineret som automatisk forรธgelse.
Hvis du รธnsker at fรฅ det sidste indsรฆt-id, der blev genereret af MySQL, kan du bruge funktionen LAST_INSERT_ID til at gรธre det. Scriptet vist nedenfor fรฅr det sidste id, der blev genereret.
SELECT LAST_INSERT_ID();
Udfรธrelse af ovenstรฅende script giver det sidste automatiske forรธgelsesnummer genereret af INSERT-forespรธrgslen. Resultaterne er vist nedenfor.
Tip: LAST_INSERT_ID() er begrรฆnset til din egen forbindelse, sรฅ en vรฆrdi genereret af en anden brugers insert kan aldrig returneres til dig ved en fejltagelse.
Sรฅdan indstiller eller nulstiller du startvรฆrdien for AUTO_INCREMENT
Standardsekvensen starter ved 1, men det er ikke altid, hvad et projekt har brug for. Fakturanumre skal muligvis fortsรฆtte fra et รฆldre system, og en testtabel skal ofte nulstilles. MySQL eksponerer tรฆlleren direkte, sรฅ begge tilfรฆlde hรฅndteres med en enkelt klausul. Fรธlg disse trin for at kontrollere starttallet.
- Indstil vรฆrdien ved oprettelse. Tilfรธj AUTO_INCREMENT-klausulen til CREATE TABLE-sรฆtningen. Den fรธrste rรฆkke, der indsรฆttes, fรฅr derefter dette tal i stedet for 1.
- รndr vรฆrdien i en eksisterende tabel. Brug ALTER TABEL med den samme klausul. MySQL accepterer kun det nye nummer, hvis det er hรธjere end den stรธrste identifikator, der aktuelt er gemt.
- Nulstil en tabel, du har tรธmt. TRUNCATE TABLE fjerner alle rรฆkker og returnerer tรฆlleren til 1 i รฉn operation, hvilket DELETE alene ikke gรธr.
- Bekrรฆft รฆndringen. Indsรฆt en rรฆkke og lรฆs identifikatoren tilbage med LAST_INSERT_ID(), fรธr du bruger den nye sekvens.
-- Start a brand-new table at 1000 CREATE TABLE `invoices` ( `invoice_id` int UNSIGNED NOT NULL AUTO_INCREMENT, `amount` decimal(10,2), PRIMARY KEY (`invoice_id`) ) AUTO_INCREMENT = 1000; -- Move the counter on an existing table ALTER TABLE `categories` AUTO_INCREMENT = 100; -- Empty the table and reset the counter to 1 TRUNCATE TABLE `categories`;
Trinstรธrrelsen kan ogsรฅ รฆndres med systemvariablen auto_increment_increment, men den gรฆlder for hele serveren i stedet for รฉn tabel. Den bruges primรฆrt i replikering, hvor to servere ikke mรฅ generere den samme identifikator.
Hvorfor opstรฅr der huller i en AUTO_INCREMENT-sekvens?
Fรธr eller siden viser en tabel identifikatorer som 1, 2, 5, 6. Intet er รธdelagt. Tรฆlleren er designet til at garantere unikhed, ikke til at garantere en ubrudt rรฆkke af tal, og den udsteder aldrig den samme vรฆrdi to gange.
Huller opstรฅr af fรธlgende รฅrsager.
- Slettede rรฆkker: Nรฅr en rรฆkke slettes fra en tabel, genbruges dens automatisk forรธgede id ikke. MySQL fortsรฆtter med at generere nye numre sekventielt.
- Tilbagefรธrte transaktioner: Nummeret gรธres krav pรฅ i det รธjeblik, indsรฆttelsen kรธrer. Hvis transaktionen rulles tilbage, forsvinder rรฆkken, men nummeret er allerede brugt.
- Mislykkede indsรฆttelser: En sรฆtning, der afvises af en UNIK begrรฆnsning, kan stadig forbruge en identifikator, fรธr den fejler.
- Masseindsatser: InnoDB kan reservere en blok af tal til en indsรฆttelse med flere rรฆkker og kassere dem, den ikke bruger.
Det er en fejltagelse at forsรธge at lukke disse huller. Omnummerering af rรฆkker รธdelรฆgger alle fremmednรธgler, der peger pรฅ dem, og selve vรฆrdien har ingen forretningsmรฆssig betydning. Hvis en rapport har brug for en kontinuerlig liste, skal du generere rรฆkkenummeret i forespรธrgslen i stedet for at omskrive lagrede data.

