PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Criando uma sequência PostgreSQL para um campo (que não é o ID do registro)


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

Em seguida, adicione um padrão de coluna a scores.job_id :
ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq');

Se você deseja vincular a sequência para a coluna (para que seja excluída quando a coluna for excluída), também execute:
ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;

Tudo isso pode ser substituído pelo uso do pseudo tipo de dados serial para a coluna job_id começar com:
  • Renomear tabelas de forma segura e limpa que usam colunas de chave primária serial no Postgres?

Se sua tabela já tiver linhas, você pode querer definir a SEQUENCE para o próximo valor mais alto e preencha os valores de série ausentes na tabela:
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;
  • Como verificar uma sequência de forma eficiente para valores usados ​​e não utilizados no PostgreSQL
  • O Postgres altera a sequência manualmente
  • Como redefinir a sequência de chave primária do postgres quando ela fica fora de sincronia?

A única diferença restante, um serial coluna também está definida como NOT NULL . Você pode ou não querer isso também:
ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;

Mas você não pode apenas altere o tipo de um integer existente :
ALTER TABLE scores ALTER job_id TYPE serial;

serial não é um tipo de dados real. É apenas um recurso de conveniência de notação para CREATE TABLE .
No Postgres 10 ou posterior, considere uma IDENTITY coluna:
  • Coluna da tabela de incremento automático