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

Crear una columna de incremento automático en SQLite

SQLite tiene una forma interesante de manejar columnas de incremento automático. Por columnas de incremento automático, me refiero a columnas que se incrementan automáticamente cada vez que se insertan nuevos datos.

Esto es similar a una IDENTITY columna en SQL Server o un AUTO_INCREMENT columna en MySQL .

Este artículo explica cómo crear AUTOINCREMENT columnas en SQLite.

Crear automáticamente una columna de incremento automático

De forma predeterminada, cuando define una columna como INTEGER PRIMARY KEY , se incrementará automáticamente cada vez que inserte NULL en esa columna.

Ejemplo:

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

En esta tabla, el CatId columna es una columna de incremento automático. Esto se debe a que se ha definido usando INTEGER PRIMARY KEY .

Ahora, cuando inserto NULL en esa columna, el CatId incrementos automáticos de columna:

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

SELECT * FROM Cats;

Resultado:

CatId       CatName   
----------  ----------
1           Brush     
2           Scarcat   
3           Flutter   

Es importante tener en cuenta que puede anular el AUTOINCREMENT valor insertando su propio valor. En otras palabras, AUTOINCREMENT solo inserta un valor si no lo hace.

La forma en que funciona es el NULL se convierte automáticamente en un número entero que es uno mayor que el valor más grande de esa columna sobre todas las demás filas de la tabla. Si la tabla está vacía, el valor será 1 .

Si el valor más grande de la columna es el entero más grande posible (9223372036854775807), entonces SQLite elegirá una clave no utilizada al azar. Esto generalmente significa que reutilizará las claves antiguas que se eliminaron previamente. Si no se puede encontrar una clave no utilizada, INSERT la operación falla con un SQLITE_FULL error.

Básicamente, lo que esto significa es, si permites DELETE operaciones en la tabla, entonces no hay garantía de que todas las filas estén en orden. Existe la posibilidad de que algunas filas tengan un valor más alto que las filas insertadas en una fecha posterior.

Por lo tanto, en tales casos, no puede confiar en esta columna si necesita ordenar la tabla en orden ascendente o descendente, según el orden en que se insertaron las filas.

Afortunadamente, si esto es un problema para ti, hay una solución:el AUTOINCREMENT palabra clave.

Utilice la palabra clave AUTOINCREMENTO

Alternativamente, puede optar por configurar explícitamente la columna para que se incremente automáticamente usando el AUTOINCREMENT palabra clave.

Una ventaja de usar este método es que garantiza que todas las filas estarán en orden ascendente. Esto se debe a que no reutiliza claves previamente eliminadas. Cada clave siempre será una más que la clave más grande que haya existido en esa tabla. Si la clave más grande posible ha existido previamente en esa tabla, entonces no intente usar claves previamente eliminadas. El INSERT fallará con un SQLITE_FULL código de error.

La desventaja de usar AUTOINCREMENT La palabra clave es que utiliza CPU, memoria, espacio en disco y sobrecarga de E/S de disco adicionales.

Aquí hay un ejemplo de cómo crear una columna de incremento automático con AUTOINCREMENT palabra clave:

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

Ahora inserte datos y selecciónelos:

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

SELECT * FROM Dogs;

Resultado:

DogId       DogName   
----------  ----------
1           Yelp      
2           Woofer    
3           Fluff     

Si tuviera que eliminar Fluff de esta tabla, luego inserte una nueva fila (usando NULL como DogId), el nuevo DogId sería 4. En otras palabras, no reutilizaría 3.

Si la columna se hubiera creado sin el AUTOINCREMENT palabra clave, la siguiente fila reutilizaría el DogId de 3.

Si tuviera que insertar un DogId de 9223372036854775807 (el entero más grande posible), recibiría el siguiente error en la siguiente inserción que especifica NULL para esa columna:

Error: database or disk is full

Sin embargo, podría insertar explícitamente un valor que sea inferior a 9223372036854775807, siempre que ese valor no esté siendo utilizado por otra fila y INSERT la operación debería tener éxito sin el error anterior.

Básicamente, una vez que llegue a 9223372036854775807, el incremento automático ya no funcionará.

Columnas definidas sin AUTOINCREMENT palabra clave no tiene este problema. Regresarán automáticamente e intentarán encontrar un número entero sin usar para usarlo en su lugar. Sin embargo, si se han utilizado todos los números enteros (es decir, la tabla en realidad contiene 9223372036854775807 filas), incluso esas columnas generarán el error anterior.