SQLite
 sql >> Datenbank >  >> RDS >> SQLite

Erstellen Sie eine Auto-Increment-Spalte in SQLite

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.