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.

  • ๐Ÿ”ข Kerneadfรฆrd: AUTO_INCREMENT udsteder det nรฆste tal i rรฆkkefรธlge, hver gang en ny rรฆkke indsรฆttes, startende ved 1 og trinping af 1.
  • ๐Ÿ”‘ Primรฆr nรธglerolle: Attributten garanterer en unik identifikator uden en opslagsforespรธrgsel, sรฅ det er standardvalget for en surrogatprimรฆrnรธgle.
  • ๐Ÿงฑ Krav til kolonner: Kolonnen skal vรฆre af typen heltal og skal vรฆre indekseret, hvilket PRIMARY KEY-deklarationen allerede opfylder.
  • โž• Indsรฆt mรธnster: Udelad identifikatorkolonnen fra INSERT-sรฆtningen, og MySQL angiver vรฆrdien, og derefter returnerer LAST_INSERT_ID() den.
  • ๐ŸŽš๏ธ Brugerdefineret startvรฆrdi: CREATE TABLE eller ALTER TABLE accepterer AUTO_INCREMENT = 10 for at starte sekvensen ved et valgt tal.
  • ๐Ÿ•ณ๏ธ Forvent huller: Slettede rรฆkker og tilbagefรธrte transaktioner bruger tal permanent, sรฅ sekvensen forbliver unik, men ikke sammenhรฆngende.

MySQL AUTO_INCREMENT

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.

MySQL AUTO_INCREMENT med eksempler

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.

MySQL AUTO_INCREMENT

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.

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

Ofte Stillede Spรธrgsmรฅl

Nej. MySQL tillader prรฆcis รฉn AUTO_INCREMENT-kolonne pr. tabel, og den kolonne skal indekseres. Deklarerer den som primรฆrnรธgle opfylder indekskravet.

Indsรฆtninger mislykkes med en duplikatnรธglefejl, fordi tรฆlleren ikke kan gรฅ videre end datatypens maksimum. En usigneret TINYINT stopper ved 255. Skift kolonnen til en bredere type, f.eks. BIGINT, fรธr dette punkt.

Ja, fra MySQL 8.0 og fremefter. InnoDB skriver tรฆlleren til redo-loggen, sรฅ den gendannes efter en genstart. Tidligere versioner genberegnede den og kunne genudstede tal, der blev frigjort ved sletninger.

Delvist. AI-skemaassistenter i vรฆrktรธjer som f.eks. MySQL Workbench Foreslรฅ et heltal uden fortegn, der er bredt nok til det volumen, du beskriver. Estimatet er kun sรฅ godt som det vรฆksttal, du angiver, sรฅ verificรฉr det.

Ofte, ja. AI-forespรธrgselsassistenter peger pรฅ tilbagefรธrte transaktioner, mislykkede INSERT udsagn og slettede rรฆkker som de sรฆdvanlige รฅrsager. Brug forklaringen som et udgangspunkt og bekrรฆft den mod serverloggene.

Opsummer dette indlรฆg med: