PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Création d'une séquence PostgreSQL vers un champ (qui n'est pas l'ID de l'enregistrement)

Utilisez CREATE SEQUENCE :

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

Ajoutez ensuite une colonne par défaut à scores.job_id :

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

Si vous voulez lier la séquence à la colonne (elle est donc supprimée lorsque la colonne est supprimée), exécutez également :

ALTER SEQUENCE scores_job_id_seq OWNED BY scores.job_id;

Tout cela peut être remplacé par l'utilisation du pseudo-type de données serial pour la colonne job_id pour commencer :

  • Renommer en toute sécurité et proprement les tables qui utilisent des colonnes de clé primaire série dans Postgres ?

Si votre tableau contient déjà des lignes, vous pouvez définir la SEQUENCE à la valeur la plus élevée suivante et remplissez les valeurs de série manquantes dans le tableau :

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

Facultativement :

UPDATE scores
SET    job_id = nextval('scores_job_id_seq')
WHERE  job_id IS NULL;
  • Comment vérifier efficacement une séquence pour les valeurs utilisées et inutilisées dans PostgreSQL
  • Postgres modifie manuellement la séquence
  • Comment réinitialiser la séquence de clé primaire de postgres lorsqu'elle n'est plus synchronisée ?

La seule différence restante, un serial la colonne est également définie sur NOT NULL . Vous pouvez ou non vouloir cela aussi :

ALTER TABLE scores ALTER COLUMN job_id SET NOT NULL;

Mais vous ne pouvez pas modifiez simplement le type d'un integer existant :

ALTER TABLE scores ALTER job_id TYPE serial;

serial n'est pas un type de données réel. C'est juste une fonctionnalité de commodité de notation pour CREATE TABLE .
Dans Postgres 10 ou version ultérieure, considérez une IDENTITY colonne :

  • Colonne de tableau d'incrémentation automatique