En PostgreSQL la forma de asignar valores automaticamente a una columna (AUTOINCREMENT en MariaDB, por ejemplo) es mediante la asociacion de una secuencia de la que obtener los valores para la columna. Esto se hace automaticamente sin que nos tengamos que preocupar si el tipo elegido para la columna al crearla es SERIAL, que equivale a asignar a dicha columna la propiedad IDENTITY del estandar SQL [1].
Pero si la tabla ya esta creada, poblada y en uso, que hay que hacer?
Pues hay que crear la secuencia y asignarsela a la columna explicitamente [2]:
CREATE SEQUENCE public.table_id_seq INCREMENT 1 START 1000; ALTER TABLE public.table ALTER COLUMN id SET DEFAULT nextval('table_id_seq') ALTER SEQUENCE public.table_id_seq OWNER TO table.id; COMMIT;
Y si ya he creado la sequencia y la he asociado a la columna pero se me ha olvidado decirle a la secuencia quien es su propietario/
Pues se le dice despues, no pasa nada;
ALTER SEQUENCE public.table_id_seq OWNED BY public.items.id;
Y ya que estamos, tengo otra columna para la que tambien quiero valores por defecto, pero esta vez quiero el momento de la insercion.
Esta es facil, basta con modificar la columna en cuestion:
ALTER TABLE public.items
ALTER COLUMN create_date SET DEFAULT current_timestamp;
Referencias:
- https://www.postgresql.org/docs/current/datatype-numeric.html#DATATYPE-SERIAL
- https://dba.stackexchange.com/a/78735/189526