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.

  • ๐Ÿ”ข Kernverhalten: AUTO_INCREMENT gibt bei jeder Einfรผgung einer neuen Zeile die nรคchste fortlaufende Nummer aus, beginnend mit 1 und schrittweiseping von 1.
  • ๐Ÿ”‘ Hauptrolle: Das Attribut garantiert einen eindeutigen Bezeichner ohne Nachschlageabfrage und ist daher die Standardwahl fรผr einen kรผnstlichen Primรคrschlรผssel.
  • ๐Ÿงฑ Spaltenanforderungen: Die Spalte muss vom Typ Integer sein und indiziert werden, was die PRIMARY KEY-Deklaration bereits erfรผllt.
  • โž• Muster einfรผgen: Lassen Sie die Spalte mit dem Bezeichner in der INSERT-Anweisung weg und MySQL liefert den Wert, dann gibt LAST_INSERT_ID() ihn zurรผck.
  • ๐ŸŽš๏ธ Benutzerdefinierter Startwert: CREATE TABLE oder ALTER TABLE akzeptiert AUTO_INCREMENT = 10, um die Sequenz bei einer gewรคhlten Zahl zu beginnen.
  • ๐Ÿ•ณ๏ธ Lรผcken sind zu erwarten: Gelรถschte Zeilen und rรผckgรคngig gemachte Transaktionen verbrauchen dauerhaft Nummern, sodass die Sequenz zwar eindeutig, aber nicht mehr zusammenhรคngend bleibt.

MySQL AUTO_INCREMENT

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.

MySQL AUTO_INCREMENT mit Beispielen

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.

MySQL AUTO_INCREMENT

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.

  1. 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.
  2. ร„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.
  3. 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.
  4. 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.

Hรคufig gestellte Fragen

Nein. MySQL Erlaubt genau eine AUTO_INCREMENT-Spalte pro Tabelle, und diese Spalte muss indiziert sein. Die Deklaration als Primรคrschlรผssel erfรผllt die Indexanforderung.

Einfรผgevorgรคnge schlagen aufgrund eines doppelten Schlรผssels fehl, da der Zรคhler nicht รผber den Maximalwert des Datentyps hinaus erhรถht werden kann. Ein vorzeichenloser TINYINT-Wert endet bei 255. ร„ndern Sie die Spalte vor Erreichen dieses Wertes in einen grรถรŸeren Datentyp wie z. B. BIGINT.

Ja, von MySQL Ab Version 8.0 schreibt InnoDB den Zรคhler in das Redo-Log, sodass er nach einem Neustart wiederhergestellt wird. Frรผhere Versionen berechneten ihn neu und konnten durch Lรถschungen freigegebene Nummern erneut vergeben.

Teilweise. KI-Schema-Assistenten in Tools wie z. B. MySQL Werkbank Schlagen Sie eine vorzeichenlose Ganzzahl vor, die groรŸ genug fรผr das von Ihnen beschriebene Volumen ist. Die Schรคtzung ist nur so gut wie die von Ihnen angegebene Wachstumszahl; รผberprรผfen Sie diese daher.

Oft ja. KI-Abfrageassistenten verweisen auf rรผckgรคngig gemachte Transaktionen, die fehlgeschlagen sind. INSERT Anweisungen und gelรถschte Zeilen sind die รผblichen Ursachen. Betrachten Sie diese Erklรคrung als Ausgangspunkt und รผberprรผfen Sie sie anhand der Serverprotokolle.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: