MySQL AUTO_INCREMENT cu Exemple

⚡ Rezumat inteligent

MySQL AUTO_INCREMENT generează automat numere secvențiale pentru o coloană numerică de fiecare dată când se introduce un rând. Atributul elimină necesitatea calculării manuale a identificatorilor unici, ceea ce îl face metoda standard de populare a unei chei primare.

  • 🔢 Comportament de bază: AUTO_INCREMENT emite următorul număr din secvență de fiecare dată când se introduce un rând nou, începând de la 1 și pas cu pas.ping de 1.
  • 🔑 Rol cheie principal: Atributul garantează un identificator unic fără o interogare de căutare, deci este alegerea standard pentru o cheie primară surogat.
  • 🧱 Cerințe pentru coloane: Coloana trebuie să fie de tip întreg și trebuie să fie indexată, aspect pe care declarația PRIMARY KEY îl satisface deja.
  • Inserare model: Omiteți coloana identificator din instrucțiunea INSERT și MySQL furnizează valoarea, apoi LAST_INSERT_ID() o returnează.
  • 🎚️ Valoare inițială personalizată: CREATE TABLE sau ALTER TABLE acceptă AUTO_INCREMENT = 10 pentru a începe secvența de la un număr ales.
  • 🕳️ Așteptați-vă la lacune: Rândurile șterse și tranzacțiile anulate consumă numere permanent, astfel încât secvența rămâne unică, dar nu contiguă.

MySQL INCREMENT AUTO

Ce este creșterea automată?

Auto Increment este o funcție care operează pe tipuri de date numerice. Acesta generează automat valori numerice secvențiale de fiecare dată când o înregistrare este inserată într-un tabel pentru un câmp definit ca increment automat.

Atributul funcționează pe orice tip întreg, de la TINYINT până la BIGINT. Coloana trebuie, de asemenea, indexată, ceea ce se întâmplă automat atunci când este declarată drept cheie primară.

Când folosiți creșterea automată?

În lecția despre normalizarea bazei de date, am analizat modul în care datele pot fi stocate cu redundanță minimă, prin stocarea datelor în mai multe tabele mici, legate între ele folosind chei primare și externe.

MySQL AUTO_INCREMENT cu Exemple

O cheie primară trebuie să fie unică, deoarece identifică în mod unic un rând într-o bază de date. Dar cum ne putem asigura că cheia primară este întotdeauna unică?

Una dintre posibilele soluții ar fi utilizarea unei formule pentru a genera cheia primară, care verifică existența cheii în tabel înainte de a adăuga date. Această metodă ar putea funcționa, dar abordarea este complexă și nu este infailibilă. Două sesiuni care inserează date în același timp pot citi aceeași valoare maximă și pot intra în coliziune.

Pentru a evita o astfel de complexitate și pentru a ne asigura că cheia primară este întotdeauna unică, putem folosi MySQL Funcția de incrementare automată pentru generarea cheilor primare. Incrementarea automată este utilizată cu tipul de date INT. Tipul de date INT acceptă atât valori cu semn, cât și valori fără semn. Tipurile de date fără semn pot conține doar numere pozitive. Ca practică optimă, se recomandă definirea constrângerii fără semn asupra cheii primare de incrementare automată.

Sintaxa de incrementare automată

Odată ce raționamentul a fost clarificat, uită-te la scriptul folosit pentru a crea tabelul cu categorii de filme.

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

Observați „AUTO_INCREMENT” în câmpul category_id. Aceasta face ca ID-ul categoriei să fie generat automat de fiecare dată când un rând nou este inserat în tabel. Acesta nu este furnizat la inserarea datelor în tabel. MySQL îl generează.

Notă: Cuvântul cheie UNSIGNED dublează intervalul pozitiv al coloanei, iar lățimea afișată, odată scrisă ca int(11), este depreciată din MySQL 8.0.17 în continuare. Simplu int este forma actuală.

În mod implicit, valoarea inițială pentru AUTO_INCREMENT este 1 și va crește cu 1 pentru fiecare înregistrare nouă.

Să examinăm conținutul actual al tabelului de categorii.

SELECT * FROM `categories`;

Executarea scriptului de mai sus în MySQL Workbench-ul pentru myflixdb ne dă următoarele 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

Există opt rânduri, deci următorul ID generat ar trebui să fie 9. Să introducem acum o nouă categorie în tabelul de categorii, furnizând doar numele.

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

Executarea scriptului de mai sus împotriva myflixdb în MySQL banc de lucru ne oferă următoarele rezultate prezentate mai jos.

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

Rețineți că nu am furnizat ID-ul categoriei. MySQL a generat-o automat, deoarece ID-ul categoriei este definit ca incrementare automată.

Dacă doriți să obțineți ultimul ID de inserare care a fost generat de MySQL, puteți utiliza funcția LAST_INSERT_ID pentru a face asta. Scriptul prezentat mai jos primește ultimul id care a fost generat.

SELECT LAST_INSERT_ID();

Executarea scriptului de mai sus oferă ultimul număr de incrementare automată generat de interogarea INSERT. Rezultatele sunt afișate mai jos.

MySQL INCREMENT AUTO

Sfat: LAST_INSERT_ID() este limitată la propria conexiune, deci o valoare generată de inserția altui utilizator nu vă poate fi returnată niciodată din greșeală.

Cum se setează sau se resetează valoarea inițială AUTO_INCREMENT

Secvența implicită începe de la 1, dar acest lucru nu este întotdeauna necesar pentru un proiect. Numerele de factură pot fi necesare pentru a fi preluate dintr-un sistem vechi, iar un tabel de testare trebuie adesea resetat. MySQL expune direct contorul, astfel încât ambele cazuri sunt tratate cu o singură clauză. Urmați acești pași pentru a controla numărul de început.

  1. Setați valoarea la momentul creării. Adăugați clauza AUTO_INCREMENT la instrucțiunea CREATE TABLE. Primul rând inserat primește apoi acel număr în loc de 1.
  2. Modificați valoarea dintr-un tabel existent. Utilizare ALTER TABLE cu aceeași clauză. MySQL acceptă noul număr numai dacă acesta este mai mare decât cel mai mare identificator stocat în prezent.
  3. Resetează un tabel pe care l-ai golit. TRUNCATE TABLE elimină toate rândurile și readuce contorul la 1 într-o singură operație, lucru pe care DELETE singură nu îl face.
  4. Confirmă modificarea. Introduceți un rând și citiți identificatorul cu LAST_INSERT_ID() înainte de a vă baza pe noua secvență.
-- 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`;

Dimensiunea pasului poate fi modificată și cu variabila de sistem auto_increment_increment, dar se aplică întregului server și nu unui singur tabel. Este utilizată în principal în replicare, unde două servere nu trebuie să genereze același identificator.

De ce apar goluri într-o secvență AUTO_INCREMENT?

Mai devreme sau mai târziu, un tabel afișează identificatori precum 1, 2, 5, 6. Nimic nu este defect. Contorul este conceput pentru a garanta unicitatea, nu pentru a garanta o serie neîntreruptă de numere și nu emite niciodată aceeași valoare de două ori.

Lacunele apar din următoarele motive.

  • Rânduri șterse: Când un rând este șters dintr-un tabel, ID-ul său incrementat automat nu este reutilizat. MySQL continuă să genereze noi numere secvenţial.
  • Tranzacții anulate: Numărul este revendicat în momentul în care se execută inserarea. Dacă tranzacția este anulată, rândul dispare, dar numărul este deja cheltuit.
  • Inserări eșuate: O instrucțiune respinsă de o constrângere UNIQUE poate consuma în continuare un identificator înainte de a eșua.
  • Inserții în vrac: InnoDB poate rezerva un bloc de numere pentru o inserare pe mai multe rânduri și le poate elimina pe cele pe care nu le folosește.

Încercarea de a închide aceste goluri este o greșeală. Renumerotarea rândurilor rupe fiecare cheie externă care indică spre ele, iar valoarea în sine nu are nicio semnificație comercială. Dacă un raport are nevoie de o listă continuă, generați numărul rândului în interogare în loc să rescrieți datele stocate.

Întrebări frecvente

Nu. MySQL permite exact o coloană AUTO_INCREMENT per tabel, iar acea coloană trebuie indexată. Declararea ei ca fiind cheia principala îndeplinește cerința de indexare.

Inserările eșuează cu o eroare de cheie duplicată, deoarece contorul nu poate avansa dincolo de maximul tipului de date. Un TINYINT nesemnat se oprește la 255. Schimbați coloana la un tip mai larg, cum ar fi BIGINT, înainte de acest punct.

Da, de la MySQL Versiunea 8.0 și următoarele. InnoDB scrie contorul în jurnalul de refacere, astfel încât acesta să fie restaurat după o repornire. Versiunile anterioare îl recalculau și puteau reemite numerele eliberate prin ștergeri.

Parțial. Asistenți de schemă AI în cadrul unor instrumente precum MySQL Banc de lucru Sugerați un număr întreg fără semn, suficient de lat pentru volumul pe care îl descrieți. Estimarea este la fel de bună ca și cifra de creștere pe care o furnizați, așa că verificați-o.

Adesea, da. Asistenții de interogare cu inteligență artificială indică tranzacții anulate, tranzacții eșuate INSERT instrucțiuni și rânduri șterse ca cauze obișnuite. Tratați explicația ca punct de plecare și confirmați-o cu jurnalele serverului.

Rezumați această postare cu: