sql >> Database teknologi >  >> RDS >> SQLite

Hvordan last_insert_rowid() virker i SQLite

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.


  1. Escape-funktion til regulære udtryk eller LIKE-mønstre

  2. INSERT med dynamisk tabelnavn i triggerfunktion

  3. Forstå PIVOT-funktionen i T-SQL

  4. Sådan flyttes datafiler i SQL Server - Del 1