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.

  • ๐Ÿ”ข Ydinkรคyttรคytyminen: AUTO_INCREMENT antaa seuraavan numeron jรคrjestyksessรค aina, kun uusi rivi lisรคtรครคn, alkaen numerosta 1 ja jatkaenping by 1.
  • ๐Ÿ”‘ Ensisijainen avainrooli: Attribuutti takaa yksilรถllisen tunnisteen ilman hakukyselyรค, joten se on vakiovalinta korvaavalle ensisijaiselle avaimelle.
  • ๐Ÿงฑ Sarakkeen vaatimukset: Sarakkeen on oltava kokonaislukutyyppiรค ja sen on oltava indeksoitu, minkรค PRIMARY KEY -deklaraatio jo tรคyttรครค.
  • โž• Lisรครค kuvio: Jรคtรค tunnistesarake pois INSERT-lausekkeesta ja MySQL antaa arvon ja sitten LAST_INSERT_ID() palauttaa sen.
  • ๐ŸŽš๏ธ Mukautettu aloitusarvo: CREATE TABLE- tai ALTER TABLE -funktio hyvรคksyy AUTO_INCREMENT = 10 aloittaakseen sekvenssin valitusta numerosta.
  • ๐Ÿ•ณ๏ธ Odota aukkoja: Poistetut rivit ja takaisinperinnรคt kuluttavat numeroita pysyvรคsti, joten sarja pysyy yksilรถllisenรค, mutta ei yhtenรคisenรค.

MySQL AUTO_INCREMENT

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.

MySQL AUTO_INCREMENT esimerkkien kanssa

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.

MySQL AUTO_INCREMENT

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.

  1. Aseta arvo luontihetkellรค. Lisรครค AUTO_INCREMENT-lause CREATE TABLE -lausekkeeseen. Ensimmรคiselle lisรคtylle riville lisรคtรครคn sitten kyseinen numero yhden sijaan.
  2. 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.
  3. Nollaa tyhjentรคmรคsi pรถytรค. TRUNCATE TABLE poistaa kaikki rivit ja palauttaa laskurin arvoon 1 yhdellรค operaatiolla, mitรค pelkkรค DELETE ei tee.
  4. 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.

UKK

Ei. MySQL sallii tรคsmรคlleen yhden AUTO_INCREMENT-sarakkeen taulukkoa kohden, ja kyseinen sarake on indeksoitava. Sen mรครคrittรคminen ensisijainen avain tรคyttรครค indeksivaatimuksen.

Lisรคykset epรคonnistuvat kaksoisavaimen virheen vuoksi, koska laskuri ei voi edetรค tietotyypin maksimin yli. Etumerkitรถn TINYINT-sarake pysรคhtyy lukuun 255. Muuta sarake leveรคmmรคksi tyypiksi, kuten BIGINT, ennen tรคtรค pistettรค.

Kyllรค, alkaen MySQL Versiosta 8.0 eteenpรคin. InnoDB kirjoittaa laskurin uudelleentehtolokiin, joten se palautuu uudelleenkรคynnistyksen jรคlkeen. Aiemmat versiot laskivat sen uudelleen ja pystyivรคt antamaan poistoista vapautetut numerot uudelleen.

Osittain. Tekoรคlykaava-avustajat tyรถkalujen sisรคllรค, kuten MySQL Tyรถpรถytรค Ehdota kuvaamasi volyymin kannalta riittรคvรคn leveรครค etumerkitรถntรค kokonaislukua. Arvio on vain niin tarkka kuin antamasi kasvuluku, joten tarkista se.

Usein kyllรค. Tekoรคlyn kyselyavustajat osoittavat peruutettuihin tapahtumiin, jotka epรคonnistuivat. INSERT lauseita ja poistettuja rivejรค tavallisina syinรค. Pidรค selitystรค lรคhtรถkohtana ja vahvista se palvelimen lokien avulla.

Tiivistรค tรคmรค viesti seuraavasti: