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.
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.
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;| id | nombre |
|---|---|
| 1 | Ana |
| 2 | Luis |
| 3 | Marta |
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
| Motor | Ejemplo | Punto importante |
|---|---|---|
| PostgreSQL | id BIGINT GENERATED ALWAYS AS IDENTITY | La identidad usa una secuencia implícita. ALWAYS y BY DEFAULT controlan cómo se tratan valores explícitos. |
| MySQL | id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY | AUTO_INCREMENT genera valores; la clave primaria sigue declarada como regla propia. |
| SQLite | id INTEGER PRIMARY KEY | Es alias de ROWID en tablas ordinarias. AUTOINCREMENT cambia la reutilización y suele ser innecesario. |
| SQL Server | id BIGINT IDENTITY(1,1) PRIMARY KEY | IDENTITY 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
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.
INTEGER PRIMARY KEY.INSERT solo necesita la columna nombre.SELECT id, nombre ... ORDER BY id.Solución razonada
CREATE TEMP TABLE eventos_demo (
id INTEGER PRIMARY KEY,
nombre TEXT NOT NULL
);
INSERT INTO eventos_demo (nombre)
VALUES ('alta'), ('baja');
SELECT id, nombre
FROM eventos_demo
ORDER BY id;Como el INSERT omite id, SQLite asigna los valores. La PRIMARY KEY aporta además la regla de identificación de la fila.
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 KEYya ofrece asignación automática básica;AUTOINCREMENTtiene una semántica adicional y coste extra. - No dependas de una identidad para obtener numeración sin huecos.