sql >> Base de Datos >  >> RDS >> PostgreSQL

Crear una secuencia de PostgreSQL en un campo (que no es el ID del registro)

Usa CREATE SEQUENCE :

CREATE SEQUENCE scores_job_id_seq;  -- = default name for plain a serial

Luego agregue una columna predeterminada a scores.job_id :

ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq');

Si desea vincular la secuencia a la columna (para que se elimine cuando se elimine la columna), también ejecute:

ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;

Todo esto se puede reemplazar con el uso del tipo de datos pseudo serial para la columna job_id para empezar:

  • ¿Renombrar de forma segura y limpia las tablas que usan columnas de clave primaria serial en Postgres?

Si su tabla ya tiene filas, es posible que desee establecer la SEQUENCE al siguiente valor más alto y complete los valores de serie que faltan en la tabla:

SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 1)) FROM scores;

Opcionalmente:

UPDATE scores
SET    job_id = nextval('scores_job_id_seq')
WHERE  job_id IS NULL;
  • Cómo verificar una secuencia de manera eficiente para valores usados ​​y no usados ​​en PostgreSQL
  • Postgres modifica manualmente la secuencia
  • ¿Cómo restablecer la secuencia de clave principal de Postgres cuando no está sincronizada?

La única diferencia restante, un serial la columna también se establece en NOT NULL . Puede o no querer eso también:

ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;

Pero usted no puede simplemente modifique el tipo de un integer existente :

ALTER TABLE scores ALTER job_id TYPE serial;

serial no es un tipo de datos real. Es solo una función de conveniencia notacional para CREATE TABLE .
En Postgres 10 o posterior considere una IDENTITY columna:

  • Columna de tabla de incremento automático