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 full
Code 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.