SQLite hat eine interessante Art, mit Auto-Increment-Spalten umzugehen. Mit automatisch inkrementierenden Spalten meine ich Spalten, die automatisch inkrementiert werden, wenn neue Daten eingefügt werden.
Dies ist vergleichbar mit einer IDENTITY
Spalte in SQL Server oder ein AUTO_INCREMENT
Spalte in MySQL
.
Dieser Artikel erklärt, wie man AUTOINCREMENT
erstellt Spalten in SQLite.
Automatisch eine Auto-Increment-Spalte erstellen
Standardmäßig, wenn Sie eine Spalte als INTEGER PRIMARY KEY
definieren , es wird automatisch erhöht, wenn Sie NULL in diese Spalte einfügen.
Beispiel:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
In dieser Tabelle die CatId Spalte ist eine Autoincrement-Spalte. Dies liegt daran, dass es mit INTEGER PRIMARY KEY
definiert wurde .
Wenn ich jetzt NULL in diese Spalte einfüge, wird die CatId Spalte Autoinkremente:
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
SELECT * FROM Cats;
Ergebnis:
CatId CatName ---------- ---------- 1 Brush 2 Scarcat 3 Flutter
Es ist wichtig zu beachten, dass Sie AUTOINCREMENT
überschreiben können Wert, indem Sie Ihren eigenen Wert einfügen. Mit anderen Worten, AUTOINCREMENT
fügt nur dann einen Wert ein, wenn Sie dies nicht tun.
So funktioniert es, der NULL
wird automatisch in eine Ganzzahl konvertiert, die um eins größer ist als der größte Wert dieser Spalte gegenüber allen anderen Zeilen in der Tabelle. Wenn die Tabelle leer ist, ist der Wert 1
.
Wenn der größte Wert der Spalte die größtmögliche Ganzzahl ist (9223372036854775807), wählt SQLite zufällig einen unbenutzten Schlüssel aus. Dies bedeutet normalerweise, dass alte Schlüssel wiederverwendet werden, die zuvor gelöscht wurden. Wenn kein unbenutzter Schlüssel gefunden werden kann, wird die INSERT
Der Vorgang schlägt mit einem SQLITE_FULL
fehl Error.
Im Grunde bedeutet dies, wenn Sie DELETE
zulassen Operationen in der Tabelle, dann gibt es keine Garantie dafür, dass alle Zeilen in Ordnung sind. Es besteht die Möglichkeit, dass einige Zeilen einen höheren Wert haben als Zeilen, die zu einem späteren Zeitpunkt eingefügt werden.
Daher können Sie sich in solchen Fällen nicht auf diese Spalte verlassen, wenn Sie die Tabelle in aufsteigender oder absteigender Reihenfolge sortieren müssen, basierend auf der Reihenfolge, in der die Zeilen eingefügt wurden.
Wenn dies ein Problem für Sie ist, gibt es glücklicherweise eine Lösung:Das AUTOINCREMENT
Schlüsselwort.
Verwenden Sie das Schlüsselwort AUTOINCREMENT
Alternativ können Sie die Spalte explizit auf automatisches Inkrement setzen, indem Sie AUTOINCREMENT
verwenden Schlüsselwort.
Ein Vorteil dieser Methode besteht darin, dass sie garantiert, dass alle Zeilen in aufsteigender Reihenfolge sind. Dies liegt daran, dass zuvor gelöschte Schlüssel nicht wiederverwendet werden. Jeder Schlüssel ist immer eins mehr als der größte Schlüssel, der jemals in dieser Tabelle existiert hat. Wenn der größtmögliche Schlüssel zuvor in dieser Tabelle existiert hat, dann nicht Versuchen Sie, zuvor gelöschte Schlüssel zu verwenden. Das INSERT
schlägt mit einem SQLITE_FULL
fehl Fehlercode.
Der Nachteil der Verwendung von AUTOINCREMENT
Das Schlüsselwort ist, dass es zusätzlichen CPU-, Arbeitsspeicher-, Festplattenspeicher- und Festplatten-E/A-Overhead verbraucht.
Hier ist ein Beispiel für das Erstellen einer automatisch inkrementierenden Spalte mit dem AUTOINCREMENT
Stichwort:
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY AUTOINCREMENT,
DogName
);
Fügen Sie nun Daten ein und wählen Sie sie aus:
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' ),
( NULL, 'Fluff' );
SELECT * FROM Dogs;
Ergebnis:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer 3 Fluff
Wenn ich Fluff löschen würde aus dieser Tabelle, dann fügen Sie eine neue Zeile ein (mit NULL
als DogId), wäre die neue DogId 4. Mit anderen Worten, es würde 3 nicht wiederverwenden.
Wenn die Spalte ohne erstellt wurde das AUTOINCREMENT
Schlüsselwort, dann würde die nächste Zeile die DogId von 3 wiederverwenden.
Wenn ich eine DogId von 9223372036854775807 (die größtmögliche Ganzzahl) einfügen würde, würde ich bei der nächsten Einfügung, die NULL
angibt, die folgende Fehlermeldung erhalten für diese Spalte:
Error: database or disk is full
Ich könnte jedoch explizit einen Wert einfügen, der kleiner als 9223372036854775807 ist, solange dieser Wert nicht bereits von einer anderen Zeile verwendet wird, und der INSERT
Der Vorgang sollte ohne den obigen Fehler erfolgreich sein.
Sobald Sie 9223372036854775807 erreichen, funktioniert die automatische Erhöhung grundsätzlich nicht mehr.
Spalten ohne AUTOINCREMENT
definiert Schlüsselwort hat dieses Problem nicht. Sie werden automatisch zurückgehen und versuchen, eine unbenutzte Ganzzahl zu finden, die stattdessen verwendet werden kann. Wenn jedoch alle Ganzzahlen verwendet wurden (d. h. die Tabelle tatsächlich 9223372036854775807 Zeilen enthält), führen selbst diese Spalten zu dem obigen Fehler.