Tema SQL
GENERATED … AS IDENTITY (PostgreSQL)
Columnas de identidad estándar SQL reemplazan el patrón SERIAL como azúcar sintáctico. Control fino de ALWAYS BY DEFAULT y ciclos de secuencia.
Descripción
CREATE TABLE t (id bigint GENERATED BY DEFAULT AS IDENTITY) es la forma moderna frente a SERIAL (que crea secuencia implícita). ALTER COLUMN … ADD GENERATED … para migraciones. Permite OWNED BY y permisos claros. Compatible mentalmente con SQL Server IDENTITY. MySQL AUTO_INCREMENT distinto; secuencias explícitas también existen en PG con CREATE SEQUENCE.
Estructura general
Forma habitual de la sentencia: orden de cláusulas, qué parte filtra, agrupa o proyecta columnas, y qué devuelve el motor. Cópiala como plantilla y sustituye nombres por tus tablas reales.
id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY
Componentes
Cada componente tiene un papel concreto en la ejecución lógica de la sentencia. Léelos en orden: así entiendes qué puedes omitir, qué es obligatorio y qué expresiones son válidas en cada sitio según tu motor.
- SERIAL
- Atajo antiguo; IDENTITY es preferible en diseño nuevo.
- INSERT
- OVERRIDING SYSTEM VALUE para cargas masivas con IDs fijos.
Ejemplos
Ejemplo 1
CREATE TABLE demo (
id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
nombre TEXT NOT NULL
);
INSERT INTO demo (nombre) VALUES ('uno'), ('dos');
Ejemplo 2
ALTER TABLE demo ALTER COLUMN id ADD GENERATED BY DEFAULT AS IDENTITY;
Los ejemplos son ilustrativos. En producción usa consultas parametrizadas (prepared statements), revisa índices y aplica el principio de menor privilegio en cuentas de base de datos.