sql >> Database >  >> RDS >> SQLite

Hoe last_insert_rowid() werkt in SQLite

SQLite heeft een functie genaamd last_insert_rowid() die de ROWID retourneert van de laatste rij-insertie van de databaseverbinding die de functie aanriep.

Voorbeeld

Hier is een voorbeeld om te demonstreren hoe de last_insert_rowid() functie werkt in SQLite.

Laten we eerst een tabel maken en wat gegevens invoegen:

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

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

Hiermee wordt automatisch een ROWID gemaakt voor elke rij. Daarom zou deze SQL-instructie drie verschillende ROWID's hebben gecreëerd; 1, 2 en 3.

We kunnen nu de last_insert_rowid() . gebruiken functie om de waarde van de laatste ROWID terug te geven.

SELECT last_insert_rowid();

Resultaat:

3

Zoals verwacht is de laatste ROWID 3.

Invoegen in een andere tabel

Merk op dat last_insert_rowid() werkt op basis van databaseverbinding, niet op tabelniveau.

Daarom, als ik een nieuwe tabel maak, voeg dan rijen in die tabel in, de last_insert_rowid() waarde wordt gebaseerd op dat invoegbewerking.

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

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

SELECT last_insert_rowid(); 

Resultaat:

2

Even terzijde:toen ik de tabellen maakte, definieerde ik de eerste kolommen als kolommen voor automatisch ophogen. Dit werd impliciet gedefinieerd toen ik INTEGER PRIMARY KEY . gebruikte .

Daarom kan ik, wanneer ik alle rijen selecteer, zien dat de laatste rij de last_insert_rowid() bevat waarde in die kolom.

SELECT * FROM Dogs;

Resultaat:

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

In SQLite is een kolom met het type INTEGER PRIMARY KEY een alias voor de ROWID.

De volgende vraag toont dit aan.

SELECT 
  rowid,
  * 
FROM Dogs;

Resultaat:

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

Merk op dat het mogelijk is om een ​​kolom te maken zonder de ingebouwde SQLite autoincrement-functie te gebruiken. Als u dit doet, kan uw "ID"-kolom een ​​andere waarde hebben dan de ROWID-waarde.

Het is ook mogelijk om de autoincrement-waarde te overschrijven met uw eigen expliciete waarde. In dit geval zal de ROWID-waarde echter nog steeds deze expliciete waarde weergeven.

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

SELECT 
  rowid,
  * 
FROM Dogs;

SELECT last_insert_rowid();

Resultaat:

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

En natuurlijk, last_insert_rowid() zal ook deze laatste ROWID-waarde weergeven.

SELECT last_insert_rowid();

Resultaat:

789

Wat is ROWID?

De ROWID is een 64-bits ondertekende integersleutel die de rij in de tabel op unieke wijze identificeert. Alle tabellen in SQLite hebben een ROWID tenzij de tabel is gedefinieerd met WITHOUT ROWID .

De ROWID-waarde is toegankelijk met een van de speciale hoofdletteronafhankelijke namen rowid , oid , of _rowid_ in plaats van een kolomnaam. Als een tabel een door de gebruiker gedefinieerde kolom bevat die een van die namen gebruikt, verwijst die naam altijd naar de expliciet gedeclareerde kolom en kan deze naam niet worden gebruikt om de gehele ROWID-waarde op te halen.

Wanneer u een tabel definieert met een kolom voor automatisch ophogen, gebruikt die kolom automatisch de ROWID-waarde voor zijn rij.

Zie Hoe AUTOINCREMENT werkt in SQLite voor meer informatie.


  1. 2 queries tegelijk uitvoeren op Oracle SQL Developer?

  2. MySQL-database maken vanuit Java

  3. sqlplus-instructie vanaf de opdrachtregel

  4. SQL commando niet juist afgesloten?