sql >> Databasteknik >  >> RDS >> PostgreSQL

Skapa en PostgreSQL-sekvens till ett fält (som inte är postens ID)

Använd CREATE SEQUENCE :

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

Lägg sedan till en kolumnstandard till scores.job_id :

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

Om du vill binda sekvensen till kolumnen (så att den raderas när kolumnen tas bort), kör också:

ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;

Allt detta kan ersättas med att använda pseudodatatypen serial för kolumnen job_id till att börja med:

  • Ändra namn på tabeller som använder seriella primärnyckelkolumner i Postgres säkert och rent?

Om din tabell redan har rader, kanske du vill ställa in SEQUENCE till näst högsta värde och fyll i saknade serievärden i tabellen:

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

Valfritt:

UPDATE scores
SET    job_id = nextval('scores_job_id_seq')
WHERE  job_id IS NULL;
  • Hur man kontrollerar en sekvens effektivt för använda och oanvända värden i PostgreSQL
  • Postgres ändrar sekvensen manuellt
  • Hur återställer man postgres primära nyckelsekvens när den inte är synkroniserad?

Den enda återstående skillnaden, en serial kolumnen är också inställd på NOT NULL . Du kanske vill eller kanske inte vill det också:

ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;

Men du kan inte ändra bara typen av ett befintligt integer :

ALTER TABLE scores ALTER job_id TYPE serial;

serial är inte en faktisk datatyp. Det är bara en notifierad bekvämlighetsfunktion för CREATE TABLE .
I Postgres 10 eller senare, överväg en IDENTITY kolumn:

  • Automatisk ökning av tabellkolumnen


  1. Skapa och få åtkomst till OLTP-databaser och tabeller i minnet

  2. Lås Oracle-databasen innan du kör skripten Delete/Load data

  3. Utföra revision av dataändringar med hjälp av tidstabell

  4. Hur man hittar poster med NULL i en kolumn