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.

  • ๐Ÿ”ข Kรคrnbeteende: AUTO_INCREMENT utfรคrdar nรคsta nummer i sekvensen varje gรฅng en ny rad infogas, med bรถrjan vid 1 och stegping genom 1.
  • ๐Ÿ”‘ Primรคr nyckelroll: Attributet garanterar en unik identifierare utan en sรถkfrรฅga, sรฅ det รคr standardvalet fรถr en surrogatprimรคrnyckel.
  • ๐Ÿงฑ Kolumnkrav: Kolumnen mรฅste vara av heltalstyp och mรฅste vara indexerad, vilket PRIMARY KEY-deklarationen redan uppfyller.
  • โž• Infoga mรถnster: Utelรคmna identifierarkolumnen frรฅn INSERT-satsen och MySQL anger vรคrdet, sedan returnerar LAST_INSERT_ID() det.
  • ๐ŸŽš๏ธ Anpassat startvรคrde: CREATE TABLE eller ALTER TABLE accepterar AUTO_INCREMENT = 10 fรถr att bรถrja sekvensen vid ett valt nummer.
  • ๐Ÿ•ณ๏ธ Fรถrvรคnta dig luckor: Borttagna rader och รฅterstรคllda transaktioner fรถrbrukar nummer permanent, sรฅ sekvensen fรถrblir unik men inte sammanhรคngande.

MySQL AUTO_INCREMENT

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.

MySQL AUTO_INCREMENT med exempel

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.

MySQL AUTO_INCREMENT

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.

  1. 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.
  2. ร„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.
  3. ร…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.
  4. 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.

Vanliga frรฅgor

Nej. MySQL tillรฅter exakt en AUTO_INCREMENT-kolumn per tabell, och den kolumnen mรฅste indexeras. Deklarerar den som primรคr nyckel uppfyller indexkravet.

Insertningar misslyckas med ett duplicerat nyckelfel, eftersom rรคknaren inte kan gรฅ vidare fรถrbi datatypens maximala vรคrde. En osignerad TINYINT stannar vid 255. ร„ndra kolumnen till en bredare typ, till exempel BIGINT, fรถre den punkten.

Ja, frรฅn MySQL 8.0 och framรฅt. InnoDB skriver rรคknaren till redo-loggen, sรฅ den รฅterstรคlls efter en omstart. Tidigare versioner berรคknade om den och kunde รฅterutge tal som frigjorts genom borttagningar.

Delvis. AI-schemaassistenter inuti verktyg som MySQL Arbetsbรคnk Fรถreslรฅ ett heltal utan tecken som รคr tillrรคckligt brett fรถr den volym du beskriver. Uppskattningen รคr bara sรฅ bra som tillvรคxtsiffran du anger, sรฅ verifiera den.

Ofta, ja. AI-frรฅgeassistenter pekar pรฅ รฅterstรคllda transaktioner, misslyckade INFOGA satser och raderade rader som vanliga orsaker. Anvรคnd fรถrklaringen som en utgรฅngspunkt och bekrรคfta den mot serverloggarna.

Sammanfatta detta inlรคgg med: