SQLite
 sql >> Base de Dados >  >> RDS >> SQLite

Como last_insert_rowid() funciona no SQLite


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.