SQLite
 sql >> Base de données >  >> RDS >> SQLite

Comment last_insert_rowid () fonctionne dans SQLite

SQLite a une fonction appelée last_insert_rowid() qui renvoie le ROWID de la dernière ligne insérée à partir de la connexion à la base de données qui a appelé la fonction.

Exemple

Voici un exemple pour montrer comment le last_insert_rowid() la fonction fonctionne dans SQLite.

Tout d'abord, créons un tableau et insérons quelques données :

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

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

Cela créera automatiquement un ROWID pour chaque ligne. Par conséquent, cette instruction SQL aurait créé trois ROWID différents; 1, 2 et 3.

Nous pouvons maintenant utiliser le last_insert_rowid() fonction pour renvoyer la valeur du dernier ROWID.

SELECT last_insert_rowid();

Résultat :

3

Comme prévu, le dernier ROWID est 3.

Insérer dans un autre tableau

Notez que last_insert_rowid() fonctionne sur la base de la connexion à la base de données, pas au niveau de la table.

Par conséquent, si je crée une nouvelle table, puis insère des lignes dans cette table, le last_insert_rowid() la valeur sera basée sur cela opération d'insertion.

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

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

SELECT last_insert_rowid(); 

Résultat :

2

En remarque, lorsque j'ai créé les tables, j'ai défini les premières colonnes comme des colonnes d'auto-incrémentation. Cela a été défini implicitement lorsque j'ai utilisé INTEGER PRIMARY KEY .

Par conséquent, lorsque je sélectionne toutes les lignes, je peux voir que la dernière ligne contient le last_insert_rowid() valeur dans cette colonne.

SELECT * FROM Dogs;

Résultat :

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

Dans SQLite, une colonne de type INTEGER PRIMARY KEY est un alias pour le ROWID.

La requête suivante le démontre.

SELECT 
  rowid,
  * 
FROM Dogs;

Résultat :

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

Notez qu'il est possible de créer une colonne sans utiliser la fonction d'auto-incrémentation SQLite intégrée. Si vous faites cela, votre colonne "ID" pourrait avoir une valeur différente de la valeur ROWID.

Il est également possible de remplacer la valeur d'auto-incrémentation par votre propre valeur explicite. Cependant, dans ce cas, la valeur ROWID reflétera toujours cette valeur explicite.

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

SELECT 
  rowid,
  * 
FROM Dogs;

SELECT last_insert_rowid();

Résultat :

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

Et bien sûr, last_insert_rowid() reflétera également cette dernière valeur ROWID.

SELECT last_insert_rowid();

Résultat :

789

Qu'est-ce que ROWID ?

Le ROWID est une clé entière signée 64 bits qui identifie de manière unique la ligne dans sa table. Toutes les tables dans SQLite ont un ROWID sauf si la table est définie à l'aide de WITHOUT ROWID .

La valeur ROWID est accessible à l'aide de l'un des noms spéciaux indépendants de la casse rowid , oid , ou _rowid_ à la place d'un nom de colonne. Si une table contient une colonne définie par l'utilisateur utilisant l'un de ces noms, ce nom fait toujours référence à la colonne explicitement déclarée et ne peut pas être utilisé pour récupérer la valeur ROWID entière.

Lorsque vous définissez une table avec une colonne d'auto-incrémentation, cette colonne utilise automatiquement la valeur ROWID pour sa ligne.

Voir Comment fonctionne AUTOINCREMENT dans SQLite pour plus d'informations.