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

INCREMENTO AUTOMÁTICO SQLite

Resumen :en este tutorial, aprenderá sobre SQLite AUTOINCREMENT atributo de columna y cuándo usarlo en su tabla.

Introducción a SQLite ROWID mesa

Cada vez que crea una tabla sin especificar el WITHOUT ROWID opción, obtienes una columna de incremento automático implícita llamada rowid . El rowid la columna almacena un entero de 64 bits con signo que identifica de forma única una fila en la tabla.

Veamos el siguiente ejemplo.

Primero, crea una nueva tabla llamada people que tiene dos columnas:first_name, y last_name :

CREATE TABLE people (
   first_name TEXT NOT NULL,
   last_name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Pruébalo

En segundo lugar, inserte una fila en people tabla usando el siguiente INSERT declaración:

INSERT INTO people (first_name, last_name)
VALUES('John', 'Doe');Code language: SQL (Structured Query Language) (sql)

Pruébalo

Tercero, consulta los datos de las people tabla usando el siguiente SELECT declaración:

SELECT
   rowid,
   first_name,
   last_name
FROM
   people;Code language: SQL (Structured Query Language) (sql)

Pruébalo

Como puede ver claramente en la salida, SQLite crea implícitamente una columna llamada rowid y asigna automáticamente un valor entero cada vez que inserta una nueva fila en la tabla.

Tenga en cuenta que también puede consultar el rowid columna usando sus alias:_rowid_ y oid .

Cuando crea una tabla que tiene una INTEGER PRIMARY KEY columna, esta columna es el alias del rowid columna.

La siguiente declaración elimina la tabla people y lo recrea. Esta vez, sin embargo, agregamos otra columna llamada person_id cuyo tipo de datos es INTEGER y la restricción de columna es PRIMARY KEY :

DROP TABLE people;

CREATE TABLE people (
   person_id INTEGER PRIMARY KEY,
   first_name TEXT NOT NULL,
   last_name TEXT NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Pruébalo

En este caso, el person_id la columna es en realidad rowid columna.

¿Cómo asigna SQLite un valor entero al rowid? columna?

Si no especifica el rowid valor o usa un NULL valor cuando inserta una nueva fila, SQLite asigna automáticamente el siguiente entero secuencial, que es uno más grande que el mayor rowid en la mesa. El rowid el valor comienza en 1.

El valor máximo de rowid la columna es 9,223,372,036,854,775,807 , que es muy grande. Si sus datos alcanzan este valor máximo e intenta insertar una nueva fila, SQLite encontrará un número entero no utilizado y lo utilizará. Si SQLite no puede encontrar ningún entero no utilizado, emitirá un SQLITE_FULL error. Además de eso, si elimina algunas filas e inserta una nueva fila, SQLite intentará reutilizar el rowid valores de las filas eliminadas.

Hagamos una prueba.

Primero, inserte una fila con el valor máximo en people mesa.

INSERT INTO people (person_id,first_name,last_name)
VALUES(	9223372036854775807,'Johnathan','Smith');Code language: SQL (Structured Query Language) (sql)

Pruébalo

En segundo lugar, inserte otra fila sin especificar un valor para person_id columna:

INSERT INTO people (first_name,last_name)
VALUES('William','Gate');Code language: SQL (Structured Query Language) (sql)

Pruébalo

Como se muestra claramente en el resultado, la nueva fila recibió un número entero sin usar.

Considere otro ejemplo.

Primero, cree una nueva tabla llamada t1 que tiene una columna:

CREATE TABLE t1(c text);Code language: SQL (Structured Query Language) (sql)

En segundo lugar, inserte algunas filas en el t1 tabla:

INSERT INTO t1(c) VALUES('A');
INSERT INTO t1(c) values('B');
INSERT INTO t1(c) values('C');
INSERT INTO t1(c) values('D');
Code language: SQL (Structured Query Language) (sql)

Tercero, consulte los datos del t1 tabla:

SELECT rowid, c FROM t1;Code language: SQL (Structured Query Language) (sql)

Cuarto, elimine todas las filas del t1 tabla:

DELETE FROM t1;Code language: SQL (Structured Query Language) (sql)

Quinto, inserte algunas filas en el t1 tabla:

INSERT INTO t1(c) values('E');
INSERT INTO t1(c) values('F');
INSERT INTO t1(c) values('G');Code language: SQL (Structured Query Language) (sql)

Finalmente, consulte los datos del t1 tabla:

SELECT rowid, c FROM t1;
Code language: SQL (Structured Query Language) (sql)

Como puede ver, los ID de fila 1, 2 y 3 se han reutilizado para las nuevas filas.

SQLite AUTOINCREMENT atributo de columna

SQLite recomienda que no use AUTOINCREMENT atributo porque:

El AUTOINCREMENT La palabra clave impone CPU, memoria, espacio en disco y sobrecarga de E/S de disco adicionales y debe evitarse si no es estrictamente necesario. Por lo general, no es necesario.

Además, la forma en que SQLite asigna un valor para el AUTOINCREMENT columna ligeramente diferente de la forma en que lo hace para el rowid columna.

Considere el siguiente ejemplo.

Primero, suelte y vuelva a crear las people mesa. Esta vez, usamos AUTOINCREMENT columna de atributos:

DROP TABLE people;

CREATE TABLE people (
   person_id INTEGER PRIMARY KEY AUTOINCREMENT,
   first_name text NOT NULL,
   last_name text NOT NULL
);Code language: SQL (Structured Query Language) (sql)

Pruébalo

En segundo lugar, inserte una fila con el máximo rowid valor en las people mesa.

INSERT INTO people (person_id,first_name,last_name)
VALUES(9223372036854775807,'Johnathan','Smith');Code language: SQL (Structured Query Language) (sql)

Pruébalo

Tercero, inserte otra fila en people mesa.

INSERT INTO people (first_name,last_name)
VALUES('John','Smith');Code language: SQL (Structured Query Language) (sql)

Pruébalo

Esta vez, SQLite emitió un mensaje de error porque person_id la columna no reutilizó el número como un rowid columna.

[Err] 13 - database or disk is fullCode language: SQL (Structured Query Language) (sql)

¿Cuándo debería usar el AUTOINCREMENT atributo de columna?

El propósito principal de usar el atributo AUTOINCREMENT es evitar que SQLite reutilice un valor que no se ha utilizado o un valor de la fila eliminada anteriormente.

Si no tiene ningún requisito como este, no debe usar el AUTOINCREMENT atributo en la clave principal.

En este tutorial, ha aprendido cómo SQLite AUTOINCREMENT El atributo funciona y cómo influye en la forma en que SQLite asigna valores a la columna de clave principal.