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

Créer une séquence sur une table existante

Définissez la valeur par défaut lorsque vous ajoutez la nouvelle colonne :

create sequence rid_seq;
alter table test add column rid integer default nextval('rid_seq');

La modification de la valeur par défaut des colonnes existantes ne modifie pas les données existantes car la base de données n'a aucun moyen de savoir quelles valeurs doivent être modifiées ; il n'y a pas de drapeau "cette colonne a la valeur par défaut" sur les valeurs de colonne, il y a juste la valeur par défaut (à l'origine NULL puisque vous n'avez rien spécifié d'autre) et la valeur actuelle (également NULL) mais un moyen de faire la différence entre "NULL car c'est la valeur par défaut" et "NULL car il a été explicitement défini sur NULL". Donc, quand vous le faites en deux étapes :

  1. Ajouter une colonne.
  2. Modifier la valeur par défaut.

PostgreSQL n'appliquera pas la valeur par défaut à la colonne que vous venez d'ajouter. Cependant, si vous ajoutez la colonne et fournissez la valeur par défaut en même temps, PostgreSQL sait quelles lignes ont la valeur par défaut (toutes) afin qu'il puisse fournir des valeurs lorsque la colonne est ajoutée.

Au fait, vous voulez probablement aussi un NOT NULL sur cette colonne :

create sequence rid_seq;
alter table test add column rid integer not null default nextval('rid_seq');

Et, comme a_horse_with_no_name notes, si vous avez uniquement l'intention d'utiliser rid_seq pour votre test.rid colonne alors vous voudrez peut-être définir sa colonne de propriétaire à test.rid afin que la séquence soit supprimée si la colonne est supprimée :

alter sequence rid_seq owned by test.rid;