MySQL AUTO_INCREMENT esimerkkien kanssa
โก รlykรคs yhteenveto
MySQL AUTO_INCREMENT luo automaattisesti perรคkkรคiset numerot numeeriselle sarakkeelle aina, kun rivi lisรคtรครคn. Mรครคrite poistaa tarpeen laskea yksilรถllisiรค tunnisteita manuaalisesti, mikรค tekee siitรค vakiotavan tรคyttรครค ensisijainen avain.

Mikรค on automaattinen lisรคys?
Automaattinen lisรคys on toiminto, joka toimii numeerisilla tietotyypeillรค. Se luo automaattisesti perรคkkรคisiรค numeerisia arvoja aina, kun tietue lisรคtรครคn taulukkoon kenttรครคn, joka on mรครคritelty automaattiseksi lisรคykseksi.
Attribuutti toimii minkรค tahansa kokonaislukutyypin kanssa TINYINT:stรค BIGINT:iin. Sarake on myรถs indeksoitava, mikรค tapahtuu automaattisesti, kun se mรครคritetรครคn ensisijaiseksi avaimeksi.
Kun kรคytรคt automaattista lisรคystรค?
Oppitunnilla aiheesta tietokannan normalisointi, tarkastelimme, miten dataa voidaan tallentaa minimaalisella redundanssilla tallentamalla dataa useisiin pieniin taulukoihin, jotka ovat yhteydessรค toisiinsa ensisijaisten ja viiteavainten avulla.
Perusavaimen on oltava yksilรถllinen, koska se yksilรถi tietokannan rivin. Mutta miten voimme varmistaa, ettรค perusavain on aina yksilรถllinen?
Yksi mahdollinen ratkaisu olisi kรคyttรครค kaavaa ensisijaisen avaimen luomiseen, joka tarkistaa avaimen olemassaolon taulukossa ennen tietojen lisรครคmistรค. Tรคmรค saattaa toimia, mutta lรคhestymistapa on monimutkainen eikรค erehtymรคtรถn. Kaksi samaan aikaan lisรคttyรค istuntoa voivat silti lukea saman maksimiarvon ja tรถrmรคtรค toisiinsa.
Tรคllaisen monimutkaisuuden vรคlttรคmiseksi ja sen varmistamiseksi, ettรค ensisijainen avain on aina ainutlaatuinen, voimme kรคyttรครค MySQL automaattisen lisรคyksen ominaisuus ensisijaisten avainten luomiseen. Automaattista lisรคystรค kรคytetรครคn INT-tietotyypin kanssa. INT-tietotyyppi tukee sekรค etumerkittyjรค ettรค etumerkittรถmiรค arvoja. Etumerkittรถmissรค tietotyypeissรค voi olla vain positiivisia lukuja. Parhaana kรคytรคntรถnรค on suositeltavaa mรครคrittรครค etumerkitรถn rajoite automaattisen lisรคyksen ensisijaiselle avaimelle.
Automaattinen lisรคyssyntaksi
Kun pรครคttely on selvitetty, tarkastellaan elokuvakategorioiden taulukon luomiseen kรคytettyรค kรคsikirjoitusta.
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`) );
Huomaa category_id-kentรคssรค oleva โAUTO_INCREMENTโ. Tรคmรค aiheuttaa sen, ettรค luokkatunnus luodaan automaattisesti aina, kun uusi rivi lisรคtรครคn taulukkoon. Sitรค ei anneta, kun tietoja lisรคtรครคn taulukkoon. MySQL synnyttรครค sen.
Huomautus: UNSIGNED-avainsana kaksinkertaistaa sarakkeen positiivisen alueen, ja nรคyttรถleveys, joka on kirjoitettu muodossa int(11), on vanhentunut MySQL 8.0.17 ja uudemmat. Yksinkertainen int on nykyinen muoto.
Oletusarvoisesti AUTO_INCREMENT-funktion aloitusarvo on 1, ja se kasvaa yhdellรค jokaista uutta tietuetta kohden.
Tarkastellaanpa kategoriataulukon nykyistรค sisรคltรถรค.
SELECT * FROM `categories`;
Suoritetaan yllรค oleva komentosarja MySQL Workbenchin vertailu myflixdb-tiedostoa vastaan โโantaa seuraavat tulokset.
| 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 |
Rivejรค on kahdeksan, joten seuraavan luodun id:n pitรคisi olla 9. Lisรคtรครคn nyt uusi luokka kategoriataulukkoon antamalla vain nimi.
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
Suoritetaan yllรค oleva komentosarja myflixdb in -ohjelmaa vastaan MySQL tyรถpรถytรค antaa meille seuraavat alla esitetyt tulokset.
| 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 |
Huomaa, ettรค emme antaneet luokan tunnusta. MySQL luotiin automaattisesti, koska luokkatunnus on mรครคritelty automaattiseksi lisรคykseksi.
Jos haluat saada viimeisen lisรคystunnuksen, jonka on luonut MySQL, voit kรคyttรครค LAST_INSERT_ID-funktiota tehdรคksesi sen. Alla nรคkyvรค skripti saa viimeisen luodun tunnuksen.
SELECT LAST_INSERT_ID();
Yllรค olevan komentosarjan suorittaminen antaa INSERT-kyselyn luoman viimeisen automaattisen lisรคyksen numeron. Tulokset nรคkyvรคt alla.
Vinkki: LAST_INSERT_ID()-funktion laajuus on rajattu omaan yhteyteesi, joten toisen kรคyttรคjรคn lisรคyskรคskyn luomaa arvoa ei voida koskaan palauttaa sinulle vahingossa.
AUTO_INCREMENT-aloitusarvon asettaminen tai palauttaminen
Oletusjรคrjestys alkaa numerosta 1, mutta se ei aina ole projektin vaatimus. Laskunumeroiden on ehkรค jatkettava vanhasta jรคrjestelmรคstรค, ja testitaulukko on usein nollattava. MySQL nรคyttรครค laskurin suoraan, joten molemmat tapaukset kรคsitellรครคn yhdellรค lausekkeella. Noudata nรคitรค ohjeita aloitusnumeron hallitsemiseksi.
- Aseta arvo luontihetkellรค. Lisรครค AUTO_INCREMENT-lause CREATE TABLE -lausekkeeseen. Ensimmรคiselle lisรคtylle riville lisรคtรครคn sitten kyseinen numero yhden sijaan.
- Muuta olemassa olevan taulukon arvoa. Kรคyttรครค ALTER TABLE samalla lausekkeella. MySQL hyvรคksyy uuden numeron vain, jos se on suurempi kuin suurin tallennettu tunniste.
- Nollaa tyhjentรคmรคsi pรถytรค. TRUNCATE TABLE poistaa kaikki rivit ja palauttaa laskurin arvoon 1 yhdellรค operaatiolla, mitรค pelkkรค DELETE ei tee.
- Vahvista muutos. Lisรครค rivi ja lue tunniste takaisin LAST_INSERT_ID()-funktiolla ennen kuin luotat uuteen sekvenssiin.
-- 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`;
Askeleen kokoa voidaan muuttaa myรถs auto_increment_increment-jรคrjestelmรคmuuttujalla, mutta se koskee koko palvelinta yhden taulukon sijaan. Sitรค kรคytetรครคn pรครคasiassa replikoinnissa, jossa kahden palvelimen ei tarvitse luoda samaa tunnistetta.
Miksi AUTO_INCREMENT-sekvenssissรค on aukkoja?
Ennemmin tai myรถhemmin taulukossa nรคkyy tunnisteita, kuten 1, 2, 5, 6. Mikรครคn ei ole rikki. Laskuri on suunniteltu takaamaan ainutlaatuisuus, ei takaamaan katkeamatonta numerosarjaa, eikรค se koskaan anna samaa arvoa kahdesti.
Aukkoja esiintyy seuraavista syistรค.
- Poistetut rivit: Kun rivi poistetaan taulukosta, sen automaattisesti kasvatettua tunnusta ei kรคytetรค uudelleen. MySQL jatkaa uusien numeroiden luomista perรคkkรคin.
- Takaisin palautetut tapahtumat: Numero varataan heti lisรคyksen suorittamisen jรคlkeen. Jos tapahtuma peruutetaan, rivi katoaa, mutta numero on jo kรคytetty.
- Epรคonnistuneet lisรคykset: UNIQUE-rajoitteen hylkรครคmรค lauseke voi silti kรคyttรครค tunnistetta ennen epรคonnistumista.
- Irtotavarana lisรคttyjรค: InnoDB voi varata numerolohkon moniriviselle lisรคykselle ja hylรคtรค ne numerot, joita se ei kรคytรค.
Nรคiden aukkojen tรคyttรคminen on virhe. Rivien uudelleennumerointi rikkoo kaikki niihin osoittavat viiteavaimet, eikรค itse arvolla ole liiketoiminnallista merkitystรค. Jos raportti tarvitsee jatkuvan luettelon, luo rivinumero kyselyssรค tallennetun datan uudelleenkirjoittamisen sijaan.

