SQLite tem uma função chamada
last_insert_rowid()
que retorna o ROWID da última inserção de linha da conexão de banco de dados que invocou a função. Exemplo
Aqui está um exemplo para demonstrar como o
last_insert_rowid()
função funciona no SQLite. Primeiro, vamos criar uma tabela e inserir alguns dados:
CREATE TABLE Cats(
CatId INTEGER PRIMARY KEY,
CatName
);
INSERT INTO Cats VALUES
( NULL, 'Brush' ),
( NULL, 'Scarcat' ),
( NULL, 'Flutter' );
Isso criará automaticamente um ROWID para cada linha. Portanto, essa instrução SQL teria criado três ROWIDs diferentes; 1, 2 e 3.
Agora podemos usar o
last_insert_rowid()
função para retornar o valor do último ROWID. SELECT last_insert_rowid();
Resultado:
3
Como esperado, o último ROWID é 3.
Inserir em uma tabela diferente
Observe que
last_insert_rowid()
funciona com base na conexão do banco de dados, não no nível da tabela. Portanto, se eu criar uma nova tabela e inserir linhas nessa tabela, o
last_insert_rowid()
o valor será baseado naquilo operação de inserção. CREATE TABLE Dogs(
DogId INTEGER PRIMARY KEY,
DogName
);
INSERT INTO Dogs VALUES
( NULL, 'Yelp' ),
( NULL, 'Woofer' );
SELECT last_insert_rowid();
Resultado:
2
Como observação lateral, quando criei as tabelas, defini as primeiras colunas como colunas de incremento automático. Isso foi definido implicitamente quando usei
INTEGER PRIMARY KEY
. Portanto, quando seleciono todas as linhas, posso ver que a última linha contém o
last_insert_rowid()
valor nessa coluna. SELECT * FROM Dogs;
Resultado:
DogId DogName ---------- ---------- 1 Yelp 2 Woofer
No SQLite, uma coluna com o tipo INTEGER PRIMARY KEY é um alias para o ROWID.
A consulta a seguir demonstra isso.
SELECT
rowid,
*
FROM Dogs;
Resultado:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer
Observe que é possível criar uma coluna sem usar o recurso de incremento automático SQLite embutido. Se você fizer isso, sua coluna “ID” poderá ter um valor diferente do valor ROWID.
Também é possível substituir o valor de incremento automático pelo seu próprio valor explícito. No entanto, neste caso, o valor ROWID ainda refletirá esse valor explícito.
INSERT INTO Dogs
VALUES ( 789, 'Fluff' );
SELECT
rowid,
*
FROM Dogs;
SELECT last_insert_rowid();
Resultado:
DogId DogId DogName ---------- ---------- ---------- 1 1 Yelp 2 2 Woofer 789 789 Fluff
E, claro,
last_insert_rowid()
também refletirá este último valor de ROWID. SELECT last_insert_rowid();
Resultado:
789
O que é ROWID?
O ROWID é uma chave inteira assinada de 64 bits que identifica exclusivamente a linha em sua tabela. Todas as tabelas no SQLite têm um ROWID, a menos que a tabela seja definida usando
WITHOUT ROWID
. O valor ROWID pode ser acessado usando um dos nomes especiais independentes de maiúsculas e minúsculas
rowid
, oid
, ou _rowid_
no lugar de um nome de coluna. Se uma tabela contiver uma coluna definida pelo usuário usando um desses nomes, esse nome sempre fará referência à coluna declarada explicitamente e não poderá ser usado para recuperar o valor ROWID inteiro. Quando você define uma tabela com uma coluna de incremento automático, essa coluna usa automaticamente o valor ROWID para sua linha.
Consulte Como o AUTOINCREMENT funciona no SQLite para obter mais informações.