De docs :
Los tipos de datos smallserial
, serial
y bigserial
no son tipos verdaderos, sino simplemente una conveniencia notacional para crear columnas de identificador único (similar a la propiedad AUTO_INCREMENT admitida por otras bases de datos). En la implementación actual, especificando:
CREATE TABLE tablename (
colname SERIAL
);
es equivalente a especificar:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename (
colname integer NOT NULL DEFAULT nextval('tablename_colname_seq')
);
ALTER SEQUENCE tablename_colname_seq OWNED BY tablename.colname;
Por lo tanto, hemos creado una columna de enteros y hemos dispuesto que sus valores predeterminados se asignen desde un generador de secuencias. Se aplica una restricción NOT NULL para garantizar que no se pueda insertar un valor nulo. (En la mayoría de los casos, también querrá adjuntar una restricción ÚNICA o CLAVE PRINCIPAL para evitar que se inserten valores duplicados por accidente, pero esto no es automático). Por último, la secuencia se marca como "propiedad de" la columna, de modo que se eliminará si se elimina la columna o la tabla.