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.

ล 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.
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.
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.
- Postavite vrijednost prilikom kreiranja. Dodajte klauzulu AUTO_INCREMENT naredbi CREATE TABLE. Prvi umetnuti redak tada dobiva taj broj umjesto 1.
- 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.
- 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.
- 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.

