web-dev-qa-db-fra.com

Créer une séquence sur une table existante

Comment créer une séquence sur une table de sorte qu'elle passe de 0 à la valeur maximale? J'ai essayé d'utiliser le code SQL suivant, mais il n'insère aucune valeur dans la table que j'utilise:

CREATE SEQUENCE rid_seq;
ALTER TABLE test ADD COLUMN rid INTEGER;
ALTER TABLE test ALTER COLUMN rid SET DEFAULT nextval('rid_seq');

La table dans laquelle j'essaie d'insérer la séquence est le résultat d'une autre requête. Je ne peux pas savoir s'il est plus logique d'ajouter la séquence au cours de cette requête initiale ou de l'ajouter à la table après l'exécution de la requête.

26
djq

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 pour les colonnes existantes ne modifie pas les données existantes car la base de données ne permet pas de savoir quelles valeurs doivent être modifiées. il n'y a pas d'indicateur "cette colonne a la valeur par défaut" sur les valeurs de colonne, il n'y a que la valeur par défaut (à l'origine NULL puisque vous n'avez rien spécifié d'autre) et la valeur actuelle (également NULL), mais il y a moyen de dire la différence entre "NULL car il s'agit des valeurs par défaut "et" NULL car il était explicitement défini sur NULL ". Alors, quand vous le faites en deux étapes:

  1. Ajouter une colonne.
  2. Changer 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 de pouvoir fournir des valeurs lors de l'ajout de la colonne.

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, en tant que a_horse_with_no_name notes, si vous souhaitez uniquement utiliser rid_seq pour votre colonne test.rid, vous souhaiterez peut-être définir sa colonne owner à test.rid afin que la séquence soit supprimée si la colonne est supprimée:

alter sequence rid_seq owned by test.rid;
40
mu is too short

Dans PostgreSQL:

UPDATE your_table SET your_column = nextval('your_sequence')
WHERE your_column IS NULL;
1
Robson Rocha