MySQL AUTO_INCREMENT med exempel
โก Smart sammanfattning
MySQL AUTO_INCREMENT genererar automatiskt sekventiella tal fรถr en numerisk kolumn varje gรฅng en rad infogas. Attributet eliminerar behovet av att berรคkna unika identifierare manuellt, vilket gรถr det till standardsรคttet att fylla i en primรคrnyckel.

Vad รคr automatisk รถkning?
Automatisk รถkning รคr en funktion som fungerar pรฅ numeriska datatyper. Den genererar automatiskt sekventiella numeriska vรคrden varje gรฅng en post infogas i en tabell fรถr ett fรคlt som definieras som automatisk inkrement.
Attributet fungerar pรฅ alla heltalstyper, frรฅn TINYINT till BIGINT. Kolumnen mรฅste ocksรฅ indexeras, vilket sker automatiskt nรคr den deklareras som primรคrnyckel.
Nรคr anvรคnder du automatisk รถkning?
I lektionen om databasnormalisering, tittade vi pรฅ hur data kan lagras med minimal redundans, genom att lagra data i mรฅnga smรฅ tabeller, relaterade till varandra med hjรคlp av primรคr- och frรคmmande nycklar.
En primรคrnyckel mรฅste vara unik, eftersom den identifierar en rad i en databas. Men hur kan vi sรคkerstรคlla att primรคrnyckeln alltid รคr unik?
En mรถjlig lรถsning vore att anvรคnda en formel fรถr att generera primรคrnyckeln, som kontrollerar nyckelns existens i tabellen innan data lรคggs till. Detta kan fungera, men metoden รคr komplex och inte idiotsรคker. Tvรฅ sessioner som infogas samtidigt kan fortfarande lรคsa samma maximala vรคrde och kollidera.
Fรถr att undvika sรฅdan komplexitet, och fรถr att sรคkerstรคlla att primรคrnyckeln alltid รคr unik, kan vi anvรคnda MySQL Funktionen fรถr automatisk รถkning fรถr att generera primรคrnycklar. Automatisk รถkning anvรคnds med datatypen INT. Datatypen INT stรถder bรฅde teckenfรถrsedda och oteckenfรถrsedda vรคrden. Oteckenfรถrsedda datatyper kan endast innehรฅlla positiva tal. Som bรคsta praxis rekommenderas att definiera den oteckenfรถrsedda begrรคnsningen pรฅ primรคrnyckeln fรถr automatisk รถkning.
Syntax fรถr automatisk รถkning
Nรคr du har avklarat resonemanget, titta pรฅ manuset som anvรคndes fรถr att skapa tabellen รถver 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`) );
Lรคgg mรคrke till "AUTO_INCREMENT" i fรคltet category_id. Detta gรถr att kategori-ID:t genereras automatiskt varje gรฅng en ny rad infogas i tabellen. Det anges inte nรคr data infogas i tabellen. MySQL genererar det.
Obs: Nyckelordet UNSIGNED fรถrdubblar kolumnens positiva intervall, och visningsbredden nรคr den skrivits som int(11) รคr fรถrรฅldrad frรฅn och med MySQL 8.0.17 och framรฅt. Vanligt int รคr den nuvarande formen.
Som standard รคr startvรคrdet fรถr AUTO_INCREMENT 1, och det รถkar med 1 fรถr varje ny post.
Lรฅt oss undersรถka det aktuella innehรฅllet i kategoritabellen.
SELECT * FROM `categories`;
Exekvera skriptet ovan i MySQL Workbench mot myflixdb ger oss fรถljande resultat.
| 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 |
Det finns รฅtta rader, sรฅ nรคsta genererade id bรถr vara 9. Lรฅt oss nu infoga en ny kategori i kategoritabellen och endast ange namnet.
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
Exekvera skriptet ovan mot myflixdb in MySQL arbetsbรคnk ger oss fรถljande resultat som visas nedan.
| 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 |
Observera att vi inte angav kategori-ID:t. MySQL genererade det automatiskt, eftersom kategori-ID:t รคr definierat som automatisk รถkning.
Om du vill fรฅ det senaste infognings-id:t som genererades av MySQL, du kan anvรคnda funktionen LAST_INSERT_ID fรถr att gรถra det. Skriptet som visas nedan fรฅr det senaste id som genererades.
SELECT LAST_INSERT_ID();
Genom att kรถra ovanstรฅende skript fรฅr du det senaste automatiska รถkningsnumret som genererades av INSERT-frรฅgan. Resultaten visas nedan.
Dricks: LAST_INSERT_ID() รคr begrรคnsat till din egen anslutning, sรฅ ett vรคrde som genereras av en annan anvรคndares insert kan aldrig returneras till dig av misstag.
Sรฅ hรคr stรคller du in eller รฅterstรคller startvรคrdet fรถr AUTO_INCREMENT
Standardsekvensen bรถrjar pรฅ 1, men det รคr inte alltid vad ett projekt behรถver. Fakturanummer kan behรถva fortsรคtta frรฅn ett รคldre system, och en testtabell mรฅste ofta รฅterstรคllas. MySQL exponerar rรคknaren direkt, sรฅ bรฅda fallen hanteras med en enda klausul. Fรถlj dessa steg fรถr att kontrollera startnumret.
- Stรคll in vรคrdet vid skapandet. Lรคgg till AUTO_INCREMENT-klausulen i CREATE TABLE-satsen. Den fรถrsta raden som infogas fรฅr dรฅ det numret istรคllet fรถr 1.
- รndra vรคrdet i en befintlig tabell. Anvรคnda ALTER TABLE med samma klausul. MySQL accepterar endast det nya numret om det รคr hรถgre รคn den stรถrsta identifieraren som fรถr nรคrvarande รคr lagrad.
- ร terstรคll en tabell du har tรถmt. TRUNCATE TABLE tar bort alla rader och returnerar rรคknaren till 1 i en operation, vilket DELETE ensamt inte gรถr.
- Bekrรคfta รคndringen. Infoga en rad och lรคs tillbaka identifieraren med LAST_INSERT_ID() innan du fรถrlitar dig pรฅ den nya sekvensen.
-- 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`;
Stegstorleken kan ocksรฅ รคndras med systemvariabeln auto_increment_increment, men den gรคller fรถr hela servern snarare รคn fรถr en tabell. Den anvรคnds frรคmst vid replikering, dรคr tvรฅ servrar inte fรฅr generera samma identifierare.
Varfรถr visas mellanrum i en AUTO_INCREMENT-sekvens?
Fรถrr eller senare visar en tabell identifierare som 1, 2, 5, 6. Ingenting รคr trasigt. Rรคknaren รคr utformad fรถr att garantera unikhet, inte fรถr att garantera en obruten serie av siffror, och den utfรคrdar aldrig samma vรคrde tvรฅ gรฅnger.
Luckor uppstรฅr av fรถljande skรคl.
- Borttagna rader: Nรคr en rad tas bort frรฅn en tabell รฅteranvรคnds inte dess automatiskt รถkade ID. MySQL fortsรคtter att generera nya nummer sekventiellt.
- ร terstรคllda transaktioner: Numret gรถrs ansprรฅk i samma รถgonblick som infogningen kรถrs. Om transaktionen รฅterstรคlls fรถrsvinner raden men numret รคr redan fรถrbrukat.
- Misslyckade insatser: Ett uttalande som avvisas av en UNIK begrรคnsning kan fortfarande fรถrbruka en identifierare innan det misslyckas.
- Stora insatser: InnoDB kan reservera ett block med siffror fรถr en flerradig infogning och ignorera de som inte anvรคnds.
Att fรถrsรถka tรคppa till dessa luckor รคr ett misstag. Att omnumrera rader bryter alla frรคmmande nycklar som pekar pรฅ dem, och sjรคlva vรคrdet har ingen affรคrsmรคssig betydelse. Om en rapport behรถver en kontinuerlig lista, generera radnumret i frรฅgan istรคllet fรถr att skriva om lagrade data.

