PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Creazione di una sequenza PostgreSQL in un campo (che non è l'ID del record)

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