MySQL AUTO_INCREMENT koos näidetega
⚡ Nutikas kokkuvõte
MySQL AUTO_INCREMENT genereerib numbrilise veeru jaoks järjekorranumbrid automaatselt iga kord, kui rida lisatakse. See atribuut välistab vajaduse unikaalsete identifikaatorite käsitsi arvutamiseks, mis teeb sellest primaarvõtme täitmise standardviisi.

Mis on automaatne suurendamine?
Automaatne suurendamine on funktsioon, mis töötab numbriliste andmetüüpidega. See genereerib automaatselt järjestikused arvväärtused iga kord, kui kirje lisatakse tabelisse automaatse juurdekasvuna määratletud välja jaoks.
Atribuut töötab mis tahes täisarvutüübi korral, alates TINYINT-ist kuni BIGINT-ini. Veerg tuleb ka indekseerida, mis toimub automaatselt, kui see deklareeritakse primaarvõtmena.
Millal kasutada automaatset suurendamist?
Tunnis teemal andmebaasi normaliseerimine, vaatasime, kuidas andmeid saab minimaalse redundantsusega salvestada, salvestades need paljudesse väikestesse tabelitesse, mis on omavahel seotud primaar- ja võõrvõtmete abil.
Primaarvõti peab olema unikaalne, kuna see identifitseerib andmebaasis rea üheselt. Aga kuidas me saame tagada, et primaarvõti on alati unikaalne?
Üks võimalikest lahendustest oleks primaarvõtme genereerimiseks valemi kasutamine, mis kontrollib enne andmete lisamist võtme olemasolu tabelis. See võib toimida, kuid lähenemisviis on keeruline ja mitte lollikindel. Kaks samal hetkel sisestavat seanssi võivad ikkagi lugeda sama maksimaalset väärtust ja põrkuda.
Sellise keerukuse vältimiseks ja primaarvõtme unikaalsuse tagamiseks saame kasutada MySQL Automaatse suurendamise funktsioon primaarvõtmete genereerimiseks. Automaatset suurendamist kasutatakse koos INT-andmetüübiga. INT-andmetüüp toetab nii allkirjastatud kui ka allkirjastamata väärtusi. Märgistamata andmetüübid saavad sisaldada ainult positiivseid arve. Parima tava kohaselt on soovitatav määratleda automaatse suurendamise primaarvõtme allkirjastamata piirang.
Automaatne juurdekasvu süntaks
Kui arutluskäik on paigas, vaadake skripti, mida kasutati filmide kategooriate tabeli loomiseks.
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`) );
Pane tähele „AUTO_INCREMENT” väljal category_id. See põhjustab kategooria ID automaatse genereerimise iga kord, kui tabelisse uus rida lisatakse. Seda ei esitata andmete tabelisse sisestamisel. MySQL genereerib seda.
Märge: Märksõna UNSIGNED kahekordistab veeru positiivse vahemiku ja kuvatav laius, mis on kirjutatud kujul int(11), on aegunud. MySQL 8.0.17 ja uuemad versioonid. Lihtne int on praegune vorm.
Vaikimisi on AUTO_INCREMENT algväärtus 1 ja see suureneb iga uue kirje puhul 1 võrra.
Uurime kategooriate tabeli praegust sisu.
SELECT * FROM `categories`;
Ülaltoodud skripti käivitamine MySQL Workbench myflixdb vastu annab meile järgmised tulemused.
| 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 |
Kuna rida on kaheksa, peaks järgmine genereeritud ID olema 9. Lisame nüüd kategooriate tabelisse uue kategooria, andes ainult nime.
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
Ülaltoodud skripti käivitamine myflixdb in vastu MySQL töölaud annab meile järgmised allpool näidatud tulemused.
| 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 |
Pange tähele, et me ei esitanud kategooria ID-d. MySQL genereeris selle automaatselt, kuna kategooria ID on määratletud automaatse suurendamisena.
Kui soovite saada viimast lisamise ID-d, mille genereeris MySQL, saate selleks kasutada funktsiooni LAST_INSERT_ID. Allpool näidatud skript saab viimati loodud ID.
SELECT LAST_INSERT_ID();
Ülaltoodud skripti käivitamine annab INSERT-päringu poolt genereeritud viimase automaatse juurdekasvu numbri. Tulemused on näidatud allpool.
Vihje: LAST_INSERT_ID() ulatus on piiratud teie enda ühendusega, seega teise kasutaja sisestatud väärtusega ei saa teile kunagi kogemata tagastada.
Kuidas AUTO_INCREMENT algväärtust määrata või lähtestada
Vaikimisi algab järjestus 1-st, aga see pole alati projekti vajadus. Arvete numbrid võivad vajada pärandsüsteemist jätkumist ja testitabel tuleb sageli lähtestada. MySQL näitab loendurit otse, seega mõlemat juhtumit käsitletakse ühe klausliga. Algusnumbri haldamiseks järgige neid samme.
- Määrake väärtus loomise ajal. Lisage CREATE TABLE lausele klausel AUTO_INCREMENT. Esimesele lisatud reale lisatakse siis see number 1 asemel.
- Muutke olemasoleva tabeli väärtust. Kasutama ALTER TABLE sama klausliga. MySQL aktsepteerib uut numbrit ainult siis, kui see on suurem kui suurim hetkel salvestatud identifikaator.
- Tühjendatud laua lähtestamine. TRUNCATE TABLE eemaldab kõik read ja tagastab loenduri väärtuseks 1 ühe operatsiooniga, mida DELETE üksi ei tee.
- Kinnitage muudatus. Lisa rida ja loe identifikaator tagasi funktsiooniga LAST_INSERT_ID() enne uuele järjestusele toetumist.
-- 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`;
Sammu suurust saab muuta ka süsteemimuutujaga auto_increment_increment, kuid see kehtib kogu serveri, mitte ühe tabeli kohta. Seda kasutatakse peamiselt replikatsioonis, kus kaks serverit ei tohi genereerida sama identifikaatorit.
Miks AUTO_INCREMENT järjestuses lüngad ilmuvad?
Varem või hiljem kuvatakse tabelis identifikaatoreid nagu 1, 2, 5, 6. Miski pole katki. Loendur on loodud unikaalsuse tagamiseks, mitte katkematu numbrite jooksu tagamiseks, ja see ei väljasta kunagi sama väärtust kaks korda.
Lüngad tekivad järgmistel põhjustel.
- Kustutatud read: Kui rida tabelist kustutatakse, siis selle automaatselt suurendatud ID-d uuesti ei kasutata. MySQL jätkab järjestikku uute numbrite genereerimist.
- Tagasipööratud tehingud: Number kinnitatakse sisestamise hetkel. Kui tehing tühistatakse, siis rida kaob, kuid number on juba kulutatud.
- Ebaõnnestunud lisamised: UNIQUE piirangu poolt tagasi lükatud avaldus saab enne nurjumist ikkagi identifikaatori tarbida.
- Hulgi lisad: InnoDB võib reserveerida numbriploki mitmerealise lisamise jaoks ja loobuda neist, mida ta ei kasuta.
Nende lünkade täitmise katse on viga. Ridade ümbernummerdamine lõhub iga neile osutava võõrvõtme ja väärtusel endal pole ärilist tähendust. Kui aruanne vajab pidevat loendit, genereerige päringus rea number salvestatud andmete ümberkirjutamise asemel.

