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

Wie last_insert_rowid() in SQLite funktioniert

SQLite hat eine Funktion namens last_insert_rowid() die die ROWID der letzten Zeileneinfügung von der Datenbankverbindung zurückgibt, die die Funktion aufgerufen hat.

Beispiel

Hier ist ein Beispiel, um zu demonstrieren, wie die last_insert_rowid() Funktion funktioniert in SQLite.

Lassen Sie uns zuerst eine Tabelle erstellen und einige Daten einfügen:

CREATE TABLE Cats( 
    CatId INTEGER PRIMARY KEY, 
    CatName
);

INSERT INTO Cats VALUES 
    ( NULL, 'Brush' ),
    ( NULL, 'Scarcat' ),
    ( NULL, 'Flutter' );

Dadurch wird automatisch eine ROWID für jede Zeile erstellt. Daher hätte diese SQL-Anweisung drei verschiedene ROWIDs erstellt; 1, 2 und 3.

Wir können jetzt die last_insert_rowid() verwenden Funktion, um den Wert der letzten ROWID zurückzugeben.

SELECT last_insert_rowid();

Ergebnis:

3

Wie erwartet ist die letzte ROWID 3.

In eine andere Tabelle einfügen

Beachten Sie, dass last_insert_rowid() funktioniert basierend auf der Datenbankverbindung, nicht auf Tabellenebene.

Wenn ich also eine neue Tabelle erstelle, füge Zeilen in diese Tabelle ein, die last_insert_rowid() Der Wert basiert darauf Vorgang einfügen.

CREATE TABLE Dogs( 
    DogId INTEGER PRIMARY KEY, 
    DogName
);

INSERT INTO Dogs VALUES 
    ( NULL, 'Yelp' ),
    ( NULL, 'Woofer' );

SELECT last_insert_rowid(); 

Ergebnis:

2

Als Randnotiz habe ich beim Erstellen der Tabellen die ersten Spalten als Autoincrement-Spalten definiert. Dies wurde implizit definiert, als ich INTEGER PRIMARY KEY verwendete .

Wenn ich also alle Zeilen auswähle, kann ich sehen, dass die letzte Zeile die last_insert_rowid() enthält Wert in dieser Spalte.

SELECT * FROM Dogs;

Ergebnis:

DogId       DogName   
----------  ----------
1           Yelp      
2           Woofer    

In SQLite ist eine Spalte vom Typ INTEGER PRIMARY KEY ein Alias ​​für die ROWID.

Die folgende Abfrage demonstriert dies.

SELECT 
  rowid,
  * 
FROM Dogs;

Ergebnis:

DogId       DogId       DogName   
----------  ----------  ----------
1           1           Yelp      
2           2           Woofer    

Beachten Sie, dass es möglich ist, eine Spalte zu erstellen, ohne die eingebaute SQLite-Autoincrement-Funktion zu verwenden. Wenn Sie dies tun, könnte Ihre Spalte „ID“ einen anderen Wert als den ROWID-Wert haben.

Es ist auch möglich, den Autoincrement-Wert mit Ihrem eigenen expliziten Wert zu überschreiben. In diesem Fall spiegelt der ROWID-Wert jedoch immer noch diesen expliziten Wert wider.

INSERT INTO Dogs 
VALUES ( 789, 'Fluff' );

SELECT 
  rowid,
  * 
FROM Dogs;

SELECT last_insert_rowid();

Ergebnis:

DogId       DogId       DogName   
----------  ----------  ----------
1           1           Yelp      
2           2           Woofer    
789         789         Fluff     

Und natürlich last_insert_rowid() wird auch diesen letzten ROWID-Wert widerspiegeln.

SELECT last_insert_rowid();

Ergebnis:

789

Was ist ROWID?

Die ROWID ist ein vorzeichenbehafteter 64-Bit-Ganzzahlschlüssel, der die Zeile in ihrer Tabelle eindeutig identifiziert. Alle Tabellen in SQLite haben eine ROWID, es sei denn, die Tabelle ist mit WITHOUT ROWID definiert .

Auf den ROWID-Wert kann mit einem der Sonderfall-unabhängigen Namen rowid zugegriffen werden , oid , oder _rowid_ anstelle eines Spaltennamens. Wenn eine Tabelle eine benutzerdefinierte Spalte mit einem dieser Namen enthält, bezieht sich dieser Name immer auf die explizit deklarierte Spalte und kann nicht zum Abrufen des ganzzahligen ROWID-Werts verwendet werden.

Wenn Sie eine Tabelle mit einer Autoincrement-Spalte definieren, verwendet diese Spalte automatisch den ROWID-Wert für ihre Zeile.

Weitere Informationen finden Sie unter Funktionsweise von AUTOINCREMENT in SQLite.