Usa CREATE SEQUENCE
:
CREATE SEQUENCE scores_job_id_seq; -- = default name for plain a serial
Quindi aggiungi una colonna predefinita a scores.job_id
:
ALTER TABLE scores ALTER COLUMN job_id SET DEFAULT nextval('scores_job_id_seq');
Se vuoi legare la sequenza alla colonna (quindi viene eliminata quando la colonna viene eliminata), eseguire anche:
ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;
Tutto questo può essere sostituito con l'utilizzo del tipo di dati pseudo serial
per la colonna job_id
per cominciare:
- Rinominare in modo sicuro e pulito le tabelle che utilizzano colonne di chiave primaria seriale in Postgres?
Se la tua tabella ha già righe, potresti voler impostare la SEQUENCE
al valore successivo più alto e inserire i valori seriali mancanti nella tabella:
SELECT setval('scores_job_id_seq', COALESCE(max(job_id), 1)) FROM scores;
Facoltativamente:
UPDATE scores
SET job_id = nextval('scores_job_id_seq')
WHERE job_id IS NULL;
- Come controllare in modo efficiente una sequenza per valori usati e non utilizzati in PostgreSQL
- Postgres modifica manualmente la sequenza
- Come reimpostare la sequenza di chiavi primarie di Postgres quando non è sincronizzata?
L'unica differenza rimasta, un serial
anche la colonna è impostata su NOT NULL
. Potresti volerlo o meno anche tu:
ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;
Ma tu non puoi basta modificare il tipo di un integer
esistente :
ALTER TABLE scores ALTER job_id TYPE serial;
serial
non è un tipo di dati effettivo. È solo una funzionalità di notazione conveniente per CREATE TABLE
.
In Postgres 10 o versioni successive, considera un IDENTITY
colonna:
- Colonna tabella con incremento automatico