sql >> Base de Datos >  >> RDS >> SQLite

Cómo funciona last_insert_rowid() en SQLite

SQLite tiene una función llamada last_insert_rowid() que devuelve el ROWID de la última fila insertada desde la conexión de la base de datos que invocó la función.

Ejemplo

Aquí hay un ejemplo para demostrar cómo last_insert_rowid() funciona en SQLite.

Primero, creemos una tabla e insertemos algunos datos:

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

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

Esto creará automáticamente un ROWID para cada fila. Por lo tanto, esta instrucción SQL habría creado tres ROWID diferentes; 1, 2 y 3.

Ahora podemos usar last_insert_rowid() función para devolver el valor del último ROWID.

SELECT last_insert_rowid();

Resultado:

3

Como era de esperar, el último ROWID es 3.

Insertar en una tabla diferente

Tenga en cuenta que last_insert_rowid() funciona en función de la conexión de la base de datos, no a nivel de tabla.

Por lo tanto, si creo una nueva tabla, luego inserto filas en esa tabla, last_insert_rowid() el valor se basará en eso insertar operación.

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

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

SELECT last_insert_rowid(); 

Resultado:

2

Como nota al margen, cuando creé las tablas, definí las primeras columnas como columnas de incremento automático. Esto se definió implícitamente cuando usé INTEGER PRIMARY KEY .

Por lo tanto, cuando selecciono todas las filas, puedo ver que la última fila contiene el last_insert_rowid() valor en esa columna.

SELECT * FROM Dogs;

Resultado:

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

En SQLite, una columna con tipo INTEGER PRIMARY KEY es un alias para ROWID.

La siguiente consulta demuestra esto.

SELECT 
  rowid,
  * 
FROM Dogs;

Resultado:

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

Tenga en cuenta que es posible crear una columna sin utilizar la función de incremento automático de SQLite incorporada. Si hace esto, entonces su columna "ID" podría tener un valor diferente al valor de ROWID.

También es posible anular el valor de incremento automático con su propio valor explícito. Sin embargo, en este caso, el valor ROWID seguirá reflejando este 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     

Y por supuesto, last_insert_rowid() también reflejará este último valor de ROWID.

SELECT last_insert_rowid();

Resultado:

789

¿Qué es ROWID?

El ROWID es una clave de entero con signo de 64 bits que identifica de forma única la fila dentro de su tabla. Todas las tablas en SQLite tienen un ROWID a menos que la tabla se defina usando WITHOUT ROWID .

Se puede acceder al valor ROWID usando uno de los nombres especiales independientes de mayúsculas y minúsculas rowid , oid o _rowid_ en lugar de un nombre de columna. Si una tabla contiene una columna definida por el usuario que usa uno de esos nombres, ese nombre siempre hace referencia a la columna declarada explícitamente y no se puede usar para recuperar el valor ROWID entero.

Cuando define una tabla con una columna de incremento automático, esa columna usa automáticamente el valor de ROWID para su fila.

Consulte Cómo funciona AUTOINCREMENT en SQLite para obtener más información.