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