MySQL AUTO_INCREMENT mit Beispielen
โก Intelligente Zusammenfassung
MySQL AUTO_INCREMENT generiert automatisch fortlaufende Nummern fรผr eine numerische Spalte bei jedem Einfรผgen einer Zeile. Dieses Attribut macht die manuelle Berechnung eindeutiger Kennungen รผberflรผssig und ist daher die Standardmethode zum Erstellen eines Primรคrschlรผssels.

Was ist automatisches Inkrementieren?
Auto Increment ist eine Funktion, die mit numerischen Datentypen arbeitet. Sie generiert automatisch fortlaufende numerische Werte, wenn ein Datensatz fรผr ein als Auto Increment definiertes Feld in eine Tabelle eingefรผgt wird.
Das Attribut funktioniert mit allen Integer-Datentypen, von TINYINT bis BIGINT. Die Spalte muss auรerdem indiziert sein; dies geschieht automatisch, wenn sie als Primรคrschlรผssel deklariert wird.
Wann wird die automatische Inkrementierung verwendet?
In der Lektion รผber DatenbanknormalisierungWir haben uns angeschaut, wie Daten mit minimaler Redundanz gespeichert werden kรถnnen, indem die Daten in vielen kleinen Tabellen gespeichert werden, die รผber Primรคr- und Fremdschlรผssel miteinander verknรผpft sind.
Ein Primรคrschlรผssel muss eindeutig sein, da er eine Zeile in einer Datenbank eindeutig identifiziert. Doch wie kรถnnen wir sicherstellen, dass der Primรคrschlรผssel immer eindeutig ist?
Eine mรถgliche Lรถsung wรคre die Verwendung einer Formel zur Generierung des Primรคrschlรผssels, die vor dem Einfรผgen von Daten prรผft, ob der Schlรผssel bereits in der Tabelle vorhanden ist. Dies mag funktionieren, ist aber komplex und nicht narrensicher. Zwei Sitzungen, die gleichzeitig Daten einfรผgen, kรถnnen immer noch denselben Maximalwert lesen und dadurch einen Konflikt verursachen.
Um diese Komplexitรคt zu vermeiden und sicherzustellen, dass der Primรคrschlรผssel immer eindeutig ist, kรถnnen wir Folgendes verwenden: MySQL Die automatische Inkrementierung dient zur Generierung von Primรคrschlรผsseln. Sie wird mit dem Datentyp INT verwendet. Der Datentyp INT unterstรผtzt sowohl vorzeichenbehaftete als auch vorzeichenlose Werte. Vorzeichenlose Datentypen kรถnnen nur positive Zahlen enthalten. Es empfiehlt sich, die Einschrรคnkung โvorzeichenlosโ fรผr den automatisch inkrementierten Primรคrschlรผssel zu definieren.
Syntax fรผr die automatische Inkrementierung
Nachdem die Argumentation geklรคrt ist, schauen wir uns das Skript an, das zur Erstellung der Filmkategorientabelle verwendet wurde.
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`) );
Beachten Sie den Eintrag โAUTO_INCREMENTโ im Feld category_id. Dadurch wird die Kategorie-ID jedes Mal automatisch generiert, wenn eine neue Zeile in die Tabelle eingefรผgt wird. Sie wird beim Einfรผgen von Daten in die Tabelle nicht angegeben. MySQL erzeugt es.
Hinweis: Das Schlรผsselwort UNSIGNED verdoppelt den positiven Wertebereich der Spalte, und die Anzeigebreite, die einmal als int(11) geschrieben wurde, ist veraltet. MySQL 8.0.17 und folgende. Einfach int ist die aktuelle Form.
Standardmรครig ist der Startwert fรผr AUTO_INCREMENT 1 und wird fรผr jeden neuen Datensatz um 1 erhรถht.
Betrachten wir nun den aktuellen Inhalt der Kategorientabelle.
SELECT * FROM `categories`;
Ausfรผhren des obigen Skripts in MySQL Die Workbench-Analyse von myflixdb liefert folgende Ergebnisse.
| 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 |
Es existieren acht Zeilen, daher sollte die nรคchste generierte ID 9 sein. Fรผgen wir nun eine neue Kategorie in die Tabelle โKategorienโ ein und geben wir nur den Namen an.
INSERT INTO `categories` (`category_name`) VALUES ('Cartoons');
Fรผhren Sie das obige Skript fรผr die myflixdb aus MySQL Werkbank gibt uns die folgenden unten gezeigten Ergebnisse.
| 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 |
Bitte beachten Sie, dass wir die Kategorie-ID nicht angegeben haben. MySQL wurde automatisch generiert, da die Kategorie-ID als automatisch inkrementierend definiert ist.
Wenn Sie die letzte Einfรผgungs-ID erhalten mรถchten, die von generiert wurde MySQL, kรถnnen Sie dazu die Funktion LAST_INSERT_ID verwenden. Das unten gezeigte Skript ruft die zuletzt generierte ID ab.
SELECT LAST_INSERT_ID();
Die Ausfรผhrung des obigen Skripts liefert die letzte durch die INSERT-Abfrage generierte automatische Inkrementnummer. Die Ergebnisse werden unten angezeigt.
TIPP: LAST_INSERT_ID() ist auf Ihre eigene Verbindung beschrรคnkt, sodass ein Wert, der durch eine Einfรผgung eines anderen Benutzers generiert wurde, niemals versehentlich an Sie zurรผckgegeben werden kann.
So legen Sie den Startwert fรผr AUTO_INCREMENT fest oder setzen ihn zurรผck
Die Standardsequenz beginnt bei 1, aber das entspricht nicht immer den Projektanforderungen. Rechnungsnummern mรผssen mรถglicherweise aus einem Altsystem รผbernommen werden, und eine Testtabelle muss oft zurรผckgesetzt werden. MySQL Der Zรคhler wird direkt zugรคnglich gemacht, sodass beide Fรคlle mit einer einzigen Klausel behandelt werden. Fรผhren Sie die folgenden Schritte aus, um die Startzahl zu steuern.
- Den Wert bei der Erstellung festlegen. Fรผgen Sie die AUTO_INCREMENT-Klausel zur CREATE TABLE-Anweisung hinzu. Die erste eingefรผgte Zeile erhรคlt dann diese Zahl anstelle von 1.
- รndern Sie den Wert in einer bestehenden Tabelle. Arbeiten jederzeit weiterbearbeiten kรถnnen. Jede Prรคsentation und jeder KI-Avatar, den Sie von Grund auf neu erstellen oder hochladen, ALTER TABELLE mit der gleichen Klausel. MySQL Akzeptiert die neue Nummer nur, wenn sie grรถรer ist als die grรถรte aktuell gespeicherte Kennung.
- Eine geleerte Tabelle zurรผcksetzen. TRUNCATE TABLE entfernt alle Zeilen und setzt den Zรคhler in einem einzigen Vorgang auf 1 zurรผck, was DELETE allein nicht leistet.
- Bestรคtigen Sie die รnderung. Fรผgen Sie eine Zeile ein und lesen Sie die Kennung mit LAST_INSERT_ID() wieder aus, bevor Sie sich auf die neue Sequenz verlassen.
-- 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`;
Die Schrittweite lรคsst sich auch mit der Systemvariable `auto_increment_increment` รคndern, diese gilt jedoch fรผr den gesamten Server und nicht nur fรผr eine einzelne Tabelle. Sie wird hauptsรคchlich bei der Replikation verwendet, wo zwei Server nicht denselben Bezeichner generieren dรผrfen.
Warum treten Lรผcken in einer AUTO_INCREMENT-Sequenz auf?
Frรผher oder spรคter erscheinen in einer Tabelle Kennungen wie 1, 2, 5, 6. Das ist vรถllig in Ordnung. Der Zรคhler ist so konzipiert, dass er Eindeutigkeit gewรคhrleistet, nicht aber eine ununterbrochene Zahlenfolge, und er gibt niemals zweimal denselben Wert aus.
Lรผcken entstehen aus folgenden Grรผnden.
- Gelรถschte Zeilen: Wenn eine Zeile aus einer Tabelle gelรถscht wird, wird ihre automatisch inkrementierte ID nicht wiederverwendet. MySQL generiert weiterhin sequenziell neue Zahlen.
- Rรผckgรคngig gemachte Transaktionen: Die Nummer wird im Moment des Einfรผgens beansprucht. Wird die Transaktion rรผckgรคngig gemacht, verschwindet die Zeile, aber die Nummer ist bereits verbraucht.
- Fehlgeschlagene Einfรผgungen: Eine Anweisung, die aufgrund einer UNIQUE-Beschrรคnkung abgelehnt wird, kann dennoch einen Bezeichner verbrauchen, bevor sie fehlschlรคgt.
- Groรpackungen: InnoDB kann einen Nummernblock fรผr einen Mehrzeilen-Einfรผgevorgang reservieren und die nicht verwendeten Nummern verwerfen.
Der Versuch, diese Lรผcken zu schlieรen, ist ein Fehler. Durch das Umnummerieren von Zeilen werden alle Fremdschlรผssel, die auf diese Zeilen verweisen, ungรผltig, und der Wert selbst ist bedeutungslos. Benรถtigt ein Bericht eine fortlaufende Liste, sollte die Zeilennummer in der Abfrage generiert werden, anstatt gespeicherte Daten zu รผberschreiben.

