SQLite har en funktion kaldet last_insert_rowid()
der returnerer ROWID'en for den sidste rækkeindsættelse fra databaseforbindelsen, der påkaldte funktionen.
Eksempel
Her er et eksempel for at demonstrere, hvordan last_insert_rowid()
funktion virker i SQLite.
Lad os først oprette en tabel og indsætte nogle data:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
Dette vil automatisk oprette en ROWID for hver række. Derfor ville denne SQL-sætning have skabt tre forskellige ROWID'er; 1, 2 og 3.
Vi kan nu bruge last_insert_rowid()
funktion for at returnere værdien af den sidste ROWID.
SELECT last_insert_rowid();
Resultat:
3
Som forventet er den sidste ROWID 3.
Indsæt i en anden tabel
Bemærk at last_insert_rowid()
virker baseret på databaseforbindelse, ikke på tabelniveau.
Derfor, hvis jeg opretter en ny tabel, skal du indsætte rækker i den tabel, last_insert_rowid()
værdien vil være baseret på det indsæt operation.
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY,
DogName
);
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' );
SELECT last_insert_rowid();
Resultat:
2
Som en sidebemærkning, da jeg oprettede tabellerne, definerede jeg de første kolonner som autoincrement-kolonner. Dette blev defineret implicit, da jeg brugte INTEGER PRIMARY KEY
.
Derfor, når jeg vælger alle rækker, kan jeg se, at den sidste række indeholder last_insert_rowid()
værdi i den kolonne.
SELECT * FROM Dogs;
Resultat:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer
I SQLite er en kolonne med typen INTEGER PRIMARY KEY et alias for ROWID.
Følgende forespørgsel viser dette.
SELECT
rowid,
*
FROM Dogs;
Resultat:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer
Bemærk, at det er muligt at oprette en kolonne uden at bruge den indbyggede SQLite autoincrement-funktion. Hvis du gør dette, kan din "ID"-kolonne have en anden værdi end ROWID-værdien.
Det er også muligt at tilsidesætte autoincrement-værdien med din egen eksplicitte værdi. Men i dette tilfælde vil ROWID-værdien stadig afspejle denne eksplicitte værdi.
INSERT INTO Dogs
VALUES ( 789, 'Fluff' );
SELECT
rowid,
*
FROM Dogs;
SELECT last_insert_rowid();
Resultat:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer 789 789 Fluff
Og selvfølgelig last_insert_rowid()
vil også afspejle denne seneste ROWID-værdi.
SELECT last_insert_rowid();
Resultat:
789
Hvad er ROWID?
ROWID er en 64-bit signeret heltalsnøgle, der unikt identificerer rækken i dens tabel. Alle tabeller i SQLite har en ROWID, medmindre tabellen er defineret ved hjælp af WITHOUT ROWID
.
ROWID-værdien kan tilgås ved hjælp af et af de særlige store og små bogstaver uafhængige navne rowid
, oid
eller _rowid_
i stedet for et kolonnenavn. Hvis en tabel indeholder en brugerdefineret kolonne, der bruger et af disse navne, refererer det navn altid til den eksplicit erklærede kolonne og kan ikke bruges til at hente den heltallige ROWID-værdi.
Når du definerer en tabel med en autoincrement-kolonne, bruger den kolonne automatisk ROWID-værdien for sin række.
Se Hvordan AUTOINCREMENT virker i SQLite for mere information.