SQLite има функция, наречена last_insert_rowid()
който връща ROWID на последния ред вмъкнат от връзката към базата данни, която е извикала функцията.
Пример
Ето пример, за да демонстрирате как last_insert_rowid()
функцията работи в SQLite.
Първо, нека създадем таблица и да вмъкнем някои данни:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
Това автоматично ще създаде ROWID за всеки ред. Следователно този SQL оператор би създал три различни ROWID; 1, 2 и 3.
Вече можем да използваме last_insert_rowid()
функция за връщане на стойността на последния ROWID.
SELECT last_insert_rowid();
Резултат:
3
Както се очакваше, последният ROWID е 3.
Вмъкване в различна таблица
Обърнете внимание, че last_insert_rowid()
работи въз основа на връзка с база данни, а не на ниво таблица.
Следователно, ако създам нова таблица, след това вмъквам редове в тази таблица, last_insert_rowid()
стойността ще се основава на това операция вмъкване.
CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY,
DogName
);
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' );
SELECT last_insert_rowid();
Резултат:
2
Като странична бележка, когато създавах таблиците, дефинирах първите колони като колони с автоматично увеличение. Това беше дефинирано имплицитно, когато използвах INTEGER PRIMARY KEY
.
Следователно, когато избера всички редове, мога да видя, че последният ред съдържа last_insert_rowid()
стойност в тази колона.
SELECT * FROM Dogs;
Резултат:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer
В SQLite колона с тип INTEGER PRIMARY KEY е псевдоним за ROWID.
Следната заявка демонстрира това.
SELECT
rowid,
*
FROM Dogs;
Резултат:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer
Имайте предвид, че е възможно да създадете колона без да използвате вградената функция за автоматично нарастване на SQLite. Ако направите това, колоната ви „ID“ може да има различна стойност от стойността ROWID.
Възможно е също така да замените стойността за автоматично увеличение със собствена изрична стойност. В този случай обаче стойността ROWID все още ще отразява тази изрична стойност.
INSERT INTO Dogs
VALUES ( 789, 'Fluff' );
SELECT
rowid,
*
FROM Dogs;
SELECT last_insert_rowid();
Резултат:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer 789 789 Fluff
И разбира се, last_insert_rowid()
ще отразява и тази последна стойност на ROWID.
SELECT last_insert_rowid();
Резултат:
789
Какво е ROWID?
ROWID е 64-битов подписан целочислен ключ, който уникално идентифицира реда в неговата таблица. Всички таблици в SQLite имат ROWID, освен ако таблицата не е дефинирана с помощта на WITHOUT ROWID
.
Достъпът до стойността на ROWID може да се осъществи с помощта на едно от независимите от специалния регистър имена rowid
, oid
или _rowid_
на мястото на име на колона. Ако таблица съдържа дефинирана от потребителя колона, използваща едно от тези имена, тогава това име винаги препраща към изрично декларираната колона и не може да се използва за извличане на целочислената стойност ROWID.
Когато дефинирате таблица с колона с автоматично увеличение, тази колона автоматично използва стойността ROWID за своя ред.
Вижте как работи AUTOINCREMENT в SQLite за повече информация.