MySQL AUTO_INCREMENT s primjerima

โšก Pametni saลพetak

MySQL AUTO_INCREMENT automatski generira sekvencijalne brojeve za numeriฤki stupac svaki put kada se umetne redak. Atribut uklanja potrebu za ruฤnim izraฤunavanjem jedinstvenih identifikatora, ลกto ga ฤini standardnim naฤinom popunjavanja primarnog kljuฤa.

  • ๐Ÿ”ข Osnovno ponaลกanje: AUTO_INCREMENT izdaje sljedeฤ‡i broj u nizu kad god se umetne novi redak, poฤevลกi od 1 i korak po korakping by 1.
  • ๐Ÿ”‘ Primarna kljuฤna uloga: Atribut jamฤi jedinstveni identifikator bez upita za pretraลพivanje, pa je standardni izbor za surogatni primarni kljuฤ.
  • ๐Ÿงฑ Zahtjevi za stupce: Stupac mora biti cjelobrojnog tipa i mora biti indeksiran, ลกto deklaracija PRIMARY KEY veฤ‡ zadovoljava.
  • โž• Umetni uzorak: Izostavite stupac identifikatora iz naredbe INSERT i MySQL daje vrijednost, a zatim je LAST_INSERT_ID() vraฤ‡a.
  • ๐ŸŽš๏ธ Prilagoฤ‘ena poฤetna vrijednost: CREATE TABLE ili ALTER TABLE prihvaฤ‡a AUTO_INCREMENT = 10 za poฤetak niza od odabranog broja.
  • ๐Ÿ•ณ๏ธ Oฤekujte praznine: Izbrisani retci i vraฤ‡ene transakcije trajno troลกe brojeve, tako da niz ostaje jedinstven, ali ne i susjedni.

MySQL AUTO_INCREMENT

ล to je automatsko poveฤ‡anje?

Automatsko poveฤ‡anje je funkcija koja radi s numeriฤkim tipovima podataka. Automatski generira sekvencijalne numeriฤke vrijednosti svaki put kada se zapis umetne u tablicu za polje definirano kao automatsko poveฤ‡anje.

Atribut radi na bilo kojem cjelobrojnom tipu, od TINYINT do BIGINT. Stupac takoฤ‘er mora biti indeksiran, ลกto se dogaฤ‘a automatski kada se deklarira kao primarni kljuฤ.

Kada koristiti automatsko poveฤ‡anje?

U lekciji o normalizacija baze podataka, pogledali smo kako se podaci mogu pohraniti s minimalnom redundancijom, pohranjivanjem podataka u mnogo malih tablica, meฤ‘usobno povezanih primarnim i stranim kljuฤevima.

MySQL AUTO_INCREMENT s primjerima

Primarni kljuฤ mora biti jedinstven jer jedinstveno identificira redak u bazi podataka. Ali kako moลพemo osigurati da je primarni kljuฤ uvijek jedinstven?

Jedno od moguฤ‡ih rjeลกenja bilo bi koriลกtenje formule za generiranje primarnog kljuฤa, koja provjerava postojanje kljuฤa u tablici prije dodavanja podataka. To bi moglo funkcionirati, ali pristup je sloลพen i nije siguran. Dvije sesije koje se unose u istom trenutku i dalje mogu proฤitati istu maksimalnu vrijednost i sudariti se.

Kako bismo izbjegli takvu sloลพenost i osigurali da je primarni kljuฤ uvijek jedinstven, moลพemo koristiti MySQL Znaฤajka automatskog poveฤ‡anja za generiranje primarnih kljuฤeva. Automatsko poveฤ‡anje koristi se s tipom podataka INT. Tip podataka INT podrลพava i potpisane i nepotpisane vrijednosti. Nepotpisani tipovi podataka mogu sadrลพavati samo pozitivne brojeve. Kao najbolja praksa, preporuฤuje se definirati nepotpisano ograniฤenje na primarnom kljuฤu automatskog poveฤ‡anja.

Sintaksa automatskog poveฤ‡anja

Nakon ลกto ste rijeลกili problem, pogledajte skriptu koja se koristi za izradu tablice kategorija filmova.

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`)
);

Obratite pozornost na "AUTO_INCREMENT" u polju category_id. To uzrokuje da se ID kategorije automatski generira svaki put kada se novi redak umetne u tablicu. Ne navodi se prilikom umetanja podataka u tablicu. MySQL generira ga.

Biljeลกka: Kljuฤna rijeฤ UNSIGNED udvostruฤuje pozitivni raspon stupca, a ลกirina prikaza, jednom zapisana kao int(11), je zastarjela. MySQL 8.0.17 nadalje. Obiฤan int je trenutni oblik.

Prema zadanim postavkama, poฤetna vrijednost za AUTO_INCREMENT je 1 i poveฤ‡avat ฤ‡e se za 1 za svaki novi zapis.

Ispitajmo trenutni sadrลพaj tablice kategorija.

SELECT * FROM `categories`;

Izvrลกavanje gornje skripte u MySQL Workbench na myflixdb daje nam sljedeฤ‡e rezultate.

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

Postoji osam redaka, tako da bi sljedeฤ‡i generirani ID trebao biti 9. Umetnimo sada novu kategoriju u tablicu kategorija, navodeฤ‡i samo naziv.

INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');

Izvrลกavanje gornje skripte protiv myflixdb in MySQL radna tezga daje nam sljedeฤ‡e rezultate prikazane u nastavku.

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

Imajte na umu da nismo naveli ID kategorije. MySQL generirao ga je automatski, jer je ID kategorije definiran kao automatsko poveฤ‡anje.

Ako ลพelite dobiti zadnji ID umetanja koji je generirao MySQL, za to moลพete koristiti funkciju LAST_INSERT_ID. Skripta prikazana u nastavku dobiva zadnji ID koji je generiran.

SELECT LAST_INSERT_ID();

Izvrลกavanje gornjeg skripta daje zadnji broj automatskog poveฤ‡anja generiran upitom INSERT. Rezultati su prikazani u nastavku.

MySQL AUTO_INCREMENT

Savjet: LAST_INSERT_ID() je ograniฤen na vaลกu vlastitu vezu, tako da vrijednost generirana umetanjem drugog korisnika nikada ne moลพe biti vraฤ‡ena vama greลกkom.

Kako postaviti ili resetirati poฤetnu vrijednost AUTO_INCREMENT

Zadani niz poฤinje od 1, ali to nije uvijek ono ลกto je projektu potrebno. Brojevi raฤuna moลพda ฤ‡e morati nastaviti iz naslijeฤ‘enog sustava, a testna tablica se ฤesto mora resetirati. MySQL izravno otkriva brojaฤ, tako da se oba sluฤaja obraฤ‘uju jednom klauzulom. Slijedite ove korake za kontrolu poฤetnog broja.

  1. Postavite vrijednost prilikom kreiranja. Dodajte klauzulu AUTO_INCREMENT naredbi CREATE TABLE. Prvi umetnuti redak tada dobiva taj broj umjesto 1.
  2. Promijenite vrijednost u postojeฤ‡oj tablici. Koristiti ALTER TABLE s istom klauzulom. MySQL prihvaฤ‡a novi broj samo ako je veฤ‡i od najveฤ‡eg trenutno pohranjenog identifikatora.
  3. Resetirajte tablicu koju ste ispraznili. TRUNCATE TABLE uklanja sve retke i vraฤ‡a brojaฤ na 1 u jednoj operaciji, ลกto samo DELETE ne moลพe uฤiniti.
  4. Potvrdite promjenu. Umetnite redak i proฤitajte identifikator natrag pomoฤ‡u LAST_INSERT_ID() prije nego ลกto se oslonite na novi niz.
-- 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`;

Veliฤina koraka moลพe se promijeniti i sistemskom varijablom auto_increment_increment, ali se primjenjuje na cijeli posluลพitelj, a ne na jednu tablicu. Koristi se uglavnom u replikaciji, gdje dva posluลพitelja ne smiju generirati isti identifikator.

Zaลกto se praznine pojavljuju u AUTO_INCREMENT nizu?

Prije ili kasnije tablica prikazuje identifikatore poput 1, 2, 5, 6. Niลกta nije pokvareno. Brojaฤ je dizajniran da jamฤi jedinstvenost, a ne da jamฤi neprekinuti niz brojeva, i nikada ne izdaje istu vrijednost dvaput.

Praznine se pojavljuju iz sljedeฤ‡ih razloga.

  • Izbrisani retci: Kada se red izbriลกe iz tablice, njegov automatski poveฤ‡ani ID se ne koristi ponovno. MySQL nastavlja sekvencijalno generiranje novih brojeva.
  • Vraฤ‡ene transakcije: Broj se preuzima u trenutku kada se izvrลกi unos. Ako se transakcija poniลกti, redak nestaje, ali broj je veฤ‡ potroลกen.
  • Neuspjeli umetci: Naredba koju je odbilo UNIQUE ograniฤenje i dalje moลพe potroลกiti identifikator prije nego ลกto ne uspije.
  • Umetci u rasutom stanju: InnoDB moลพe rezervirati blok brojeva za umetanje viลกe redova i odbaciti one koje ne koristi.

Pokuลกaj zatvaranja tih praznina je pogreลกka. Prenumeriranje redaka prekida svaki strani kljuฤ koji pokazuje na njih, a sama vrijednost nema poslovno znaฤenje. Ako izvjeลกฤ‡e treba kontinuirani popis, generirajte broj retka u upitu umjesto prepisivanja pohranjenih podataka.

Pitanja i odgovori

Ne. MySQL dopuลกta toฤno jedan AUTO_INCREMENT stupac po tablici, a taj stupac mora biti indeksiran. Deklarisanjem kao Osnovni kljuฤ zadovoljava zahtjev indeksa.

Umetanja ne uspijevaju s pogreลกkom dupliciranog kljuฤa jer brojaฤ ne moลพe prijeฤ‡i maksimum tipa podataka. Nepotpisani TINYINT zaustavlja se na 255. Promijenite stupac u ลกiri tip, kao ลกto je BIGINT, prije te toฤke.

Da, od MySQL Od verzije 8.0 nadalje. InnoDB zapisuje brojaฤ u zapisnik ponavljanja, tako da se vraฤ‡a nakon ponovnog pokretanja. Ranije verzije su ga ponovno izraฤunavale i mogle su ponovno izdati brojeve osloboฤ‘ene brisanjem.

Djelomiฤno. Pomoฤ‡nici za AI sheme unutar alata kao ลกto su MySQL Radna tezga Predloลพite neoznaฤeni cijeli broj dovoljno ลกirok za volumen koji opisujete. Procjena je dobra samo onoliko koliko je dobra brojka rasta koju navedete, stoga je provjerite.

ฤŒesto, da. AI pomoฤ‡nici za upite upuฤ‡uju na poniลกtene transakcije, neuspjeลกne INSERT izjave i izbrisane retke kao uobiฤajene uzroke. Objaลกnjenje uzmite kao poฤetnu toฤku i provjerite ga u odnosu na zapisnike posluลพitelja.

Saลพmite ovu objavu uz: