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

Come funziona last_insert_rowid() in SQLite

SQLite ha una funzione chiamata last_insert_rowid() che restituisce il ROWID dell'ultima riga inserita dalla connessione al database che ha richiamato la funzione.

Esempio

Ecco un esempio per dimostrare come last_insert_rowid() la funzione funziona in SQLite.

Per prima cosa, creiamo una tabella e inseriamo alcuni dati:

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

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

Questo creerà automaticamente un ROWID per ogni riga. Pertanto, questa istruzione SQL avrebbe creato tre ROWID diversi; 1, 2 e 3.

Ora possiamo usare last_insert_rowid() funzione per restituire il valore dell'ultima ROWID.

SELECT last_insert_rowid();

Risultato:

3

Come previsto, l'ultimo ROWID è 3.

Inserisci in una tabella diversa

Nota che last_insert_rowid() funziona in base alla connessione al database, non a livello di tabella.

Pertanto, se creo una nuova tabella, quindi inserisco righe in quella tabella, last_insert_rowid() il valore sarà basato su quello operazione di inserimento.

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

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

SELECT last_insert_rowid(); 

Risultato:

2

Come nota a margine, quando ho creato le tabelle, ho definito le prime colonne come colonne a incremento automatico. Questo è stato definito implicitamente quando ho usato INTEGER PRIMARY KEY .

Pertanto, quando seleziono tutte le righe, vedo che l'ultima riga contiene last_insert_rowid() valore in quella colonna.

SELECT * FROM Dogs;

Risultato:

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

In SQLite, una colonna con tipo INTEGER PRIMARY KEY è un alias per ROWID.

La seguente query lo dimostra.

SELECT 
  rowid,
  * 
FROM Dogs;

Risultato:

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

Si noti che è possibile creare una colonna senza utilizzare la funzione di incremento automatico SQLite integrata. In tal caso, la colonna "ID" potrebbe avere un valore diverso dal valore ROWID.

È anche possibile sostituire il valore di incremento automatico con il proprio valore esplicito. Tuttavia, in questo caso, il valore ROWID rifletterà comunque questo valore esplicito.

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

SELECT 
  rowid,
  * 
FROM Dogs;

SELECT last_insert_rowid();

Risultato:

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

E, naturalmente, last_insert_rowid() rifletterà anche questo ultimo valore ROWID.

SELECT last_insert_rowid();

Risultato:

789

Cos'è ROWID?

Il ROWID è una chiave intera con segno a 64 bit che identifica in modo univoco la riga all'interno della sua tabella. Tutte le tabelle in SQLite hanno un ROWID a meno che la tabella non sia definita usando WITHOUT ROWID .

È possibile accedere al valore ROWID utilizzando uno dei nomi speciali indipendenti da maiuscole e minuscole rowid , oid o _rowid_ al posto del nome di una colonna. Se una tabella contiene una colonna definita dall'utente che utilizza uno di quei nomi, quel nome fa sempre riferimento alla colonna dichiarata in modo esplicito e non può essere utilizzato per recuperare il valore ROWID intero.

Quando definisci una tabella con una colonna di incremento automatico, tale colonna utilizza automaticamente il valore ROWID per la sua riga.

Per ulteriori informazioni, vedere come funziona AUTOINCREMENT in SQLite.