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.