sql >> Databasteknik >  >> RDS >> SQLite

Hur last_insert_rowid() fungerar i SQLite

SQLite har en funktion som heter last_insert_rowid() som returnerar ROWID för den sista radinfogningen från databasanslutningen som anropade funktionen.

Exempel

Här är ett exempel för att visa hur last_insert_rowid() funktionen fungerar i SQLite.

Låt oss först skapa en tabell och infoga lite data:

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

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

Detta skapar automatiskt en ROWID för varje rad. Därför skulle denna SQL-sats ha skapat tre olika ROWID:er; 1, 2 och 3.

Vi kan nu använda last_insert_rowid() funktion för att returnera värdet för den senaste ROWID.

SELECT last_insert_rowid();

Resultat:

3

Som väntat är den sista ROWID 3.

Infoga i en annan tabell

Observera att last_insert_rowid() fungerar baserat på databasanslutning, inte på tabellnivå.

Därför, om jag skapar en ny tabell, infogar du rader i den tabellen, last_insert_rowid() värdet kommer att baseras på det infogningsoperation.

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

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

SELECT last_insert_rowid(); 

Resultat:

2

Som en sidoanteckning, när jag skapade tabellerna, definierade jag de första kolumnerna som autoinkrementkolumner. Detta definierades implicit när jag använde INTEGER PRIMARY KEY .

Därför, när jag markerar alla rader, kan jag se att den sista raden innehåller last_insert_rowid() värde i den kolumnen.

SELECT * FROM Dogs;

Resultat:

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

I SQLite är en kolumn med typen INTEGER PRIMARY KEY ett alias för ROWID.

Följande fråga visar detta.

SELECT 
  rowid,
  * 
FROM Dogs;

Resultat:

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

Observera att det är möjligt att skapa en kolumn utan att använda den inbyggda SQLite autoincrement-funktionen. Om du gör detta kan din "ID"-kolumn ha ett annat värde än ROWID-värdet.

Det är också möjligt att åsidosätta autoinkrementvärdet med ditt eget explicita värde. Men i det här fallet kommer ROWID-värdet fortfarande att återspegla detta explicita värde.

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     

Och naturligtvis last_insert_rowid() kommer också att återspegla det senaste ROWID-värdet.

SELECT last_insert_rowid();

Resultat:

789

Vad är ROWID?

ROWID är en 64-bitars signerad heltalsnyckel som unikt identifierar raden i sin tabell. Alla tabeller i SQLite har en ROWID om inte tabellen är definierad med WITHOUT ROWID .

ROWID-värdet kan nås med ett av de speciella skiftlägesoberoende namnen rowid , oid , eller _rowid_ i stället för ett kolumnnamn. Om en tabell innehåller en användardefinierad kolumn som använder ett av dessa namn, refererar det namnet alltid till den explicit deklarerade kolumnen och kan inte användas för att hämta heltals ROWID-värdet.

När du definierar en tabell med en kolumn för autoinkrement, använder den kolumnen automatiskt ROWID-värdet för sin rad.

Se Hur AUTOINCREMENT fungerar i SQLite för mer information.


  1. Hur man anger den invarianta kulturen när man använder FORMAT() i SQL Server

  2. SQLite Listview onclick filter db för att öppna resulterar i ny aktivitet

  3. PostgreSQL-utlösare och grunder för lagrade funktioner

  4. Escape sträng Python för MySQL