Estructura · identificadores

Claves autogeneradas: IDENTITY, AUTO_INCREMENT y AUTOINCREMENT

Haz que la base asigne identificadores nuevos sin confundir generación automática con una clave primaria o una columna calculada.

Lectura: 6–8 minSQL comprobadoPráctica con pistas
Contenido de esta guía

Respuesta rápida

Una columna autogenerada permite que el motor asigne un valor nuevo al insertar una fila. La idea es común, pero la sintaxis y algunas garantías cambian entre motores: PostgreSQL usa columnas IDENTITY, MySQL usa AUTO_INCREMENT, SQL Server usa la propiedad IDENTITY y SQLite puede generar claves con INTEGER PRIMARY KEY.

No mezcles conceptos: “generar un número” y “garantizar una clave válida” no son exactamente lo mismo. Declara PRIMARY KEY o UNIQUE cuando necesites esa regla de integridad.

Modelo mental: la base propone el identificador

Imagina una tabla de clientes. Tu aplicación conoce el nombre y el correo, pero no necesita decidir cuál será el próximo id. Al insertar la fila, la base genera el identificador según el mecanismo de ese motor.

Idea general
INSERT INTO clientes (nombre, email)
VALUES ('Nora Díaz', 'nora@example.com');

La columna de identidad no aparece en el INSERT. El motor decide el valor que corresponde.

Ejemplo comprobado en SQLite

En una tabla SQLite ordinaria, una columna declarada exactamente como INTEGER PRIMARY KEY es un alias de ROWID. Si omites su valor en un INSERT, SQLite asigna normalmente un entero disponible de forma automática.

SQLite 3.46.1 · comprobado
CREATE TEMP TABLE clientes_demo (
  id INTEGER PRIMARY KEY,
  nombre TEXT NOT NULL
);

INSERT INTO clientes_demo (nombre)
VALUES ('Ana'), ('Luis'), ('Marta');

SELECT id, nombre
FROM clientes_demo
ORDER BY id;
Resultado comprobado
idnombre
1Ana
2Luis
3Marta

SQLite también acepta la palabra AUTOINCREMENT, pero su documentación advierte que añade coste y que normalmente no es necesaria. Su función principal es cambiar la política de reutilización de valores ROWID, no “activar” la generación básica de INTEGER PRIMARY KEY.

Sintaxis por motor

Formas habituales de declarar una clave generada
MotorEjemploPunto importante
PostgreSQLid BIGINT GENERATED ALWAYS AS IDENTITYLa identidad usa una secuencia implícita. ALWAYS y BY DEFAULT controlan cómo se tratan valores explícitos.
MySQLid BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEYAUTO_INCREMENT genera valores; la clave primaria sigue declarada como regla propia.
SQLiteid INTEGER PRIMARY KEYEs alias de ROWID en tablas ordinarias. AUTOINCREMENT cambia la reutilización y suele ser innecesario.
SQL Serverid BIGINT IDENTITY(1,1) PRIMARY KEYIDENTITY genera valores a partir de semilla e incremento, pero no sustituye por sí sola una restricción de unicidad.

IDENTITY no es una columna generada por expresión

Una columna generada calcula su valor a partir de otras columnas de la fila, por ejemplo precio * cantidad. Una columna de identidad genera un valor independiente, normalmente para identificar filas nuevas. En PostgreSQL ambas características son distintas y una misma columna no puede ser simultáneamente identidad y columna generada.

Errores frecuentes

Asumir que el número nunca tendrá huecos

Una identidad sirve para generar valores, no para prometer una secuencia contable perfecta. Rollbacks, reservas internas, borrados y reglas del motor pueden dejar huecos. No uses el id como contador de negocio.

Copiar la sintaxis de otro motor

AUTO_INCREMENT, IDENTITY y AUTOINCREMENT no son sinónimos sintácticos. Comprueba la documentación del motor antes de diseñar una migración.

Confundir generación con integridad

Si la columna debe identificar de forma única a cada fila, declara la restricción correspondiente. En SQL Server, por ejemplo, la propiedad IDENTITY no garantiza por sí sola unicidad.

Práctica guiada

Inicial · diseño de tabla

Crea IDs sin escribirlos a mano

En SQLite, crea una tabla temporal eventos_demo con id INTEGER PRIMARY KEY y nombre TEXT NOT NULL. Inserta alta y baja sin indicar el id.

Criterio de éxito: al ordenar por id, obtienes 1 | alta y 2 | baja.

Qué debes recordar

  • La generación automática evita que la aplicación calcule manualmente el próximo id.
  • La sintaxis depende del motor.
  • Generación automática y unicidad son conceptos relacionados, pero no idénticos.
  • En SQLite, INTEGER PRIMARY KEY ya ofrece asignación automática básica; AUTOINCREMENT tiene una semántica adicional y coste extra.
  • No dependas de una identidad para obtener numeración sin huecos.

Conceptos relacionados

Fuentes técnicas consultadas