web-dev-qa-db-fra.com

Comment puis-je ajouter une colonne à une base de données Postgresql qui n'autorise pas les valeurs NULL?

J'ajoute une nouvelle colonne "NOT NULL" à ma base de données Postgresql à l'aide de la requête suivante (nettoyée pour Internet):

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;

Chaque fois que j'exécute cette requête, le message d'erreur suivant s'affiche:

ERROR:  column "mycolumn" contains null values

Je suis perplexe. Où vais-je mal?

REMARQUE: J'utilise principalement pgAdmin III (1.8.4), mais j'ai reçu la même erreur lorsque j'ai exécuté le code SQL à partir de Terminal.

224
Huuuze

Vous devez définir une valeur par défaut.

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL DEFAULT 'foo';

... some work (set real values as you want)...

ALTER TABLE mytable ALTER COLUMN mycolumn DROP DEFAULT;
365
Luc M

Comme d'autres l'ont observé, vous devez créer une colonne Nullable ou fournir une valeur DEFAULT. Si cela n’est pas assez flexible (par exemple, si vous avez besoin que la nouvelle valeur soit calculée pour chaque ligne individuellement), vous pouvez utiliser le fait que dans PostgreSQL, toutes les commandes DDL peuvent être exécutées dans une transaction:

BEGIN;
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50);
UPDATE mytable SET mycolumn = timeofday();    -- Just a silly example
ALTER TABLE mytable ALTER COLUMN mycolumn SET NOT NULL;
COMMIT;
70
j_random_hacker

Étant donné que des lignes existent déjà dans la table, l'instruction ALTER tente d'insérer NULL dans la colonne nouvellement créée pour toutes les lignes existantes. Vous devez ajouter la colonne en autorisant NULL, puis remplissez la colonne avec les valeurs souhaitées, puis définissez-la sur NOT NULL par la suite.

48
Sean Bright

Vous devez soit définir une valeur par défaut, soit faire ce que dit Sean et l'ajouter sans la contrainte NULL jusqu'à ce que vous ayez rempli les lignes existantes.

5
Paul Tomblin

Spécifier une valeur par défaut fonctionnerait également si une valeur par défaut était appropriée.

2
Ryan Graham

Ou, créez une nouvelle table en tant que temp avec la colonne supplémentaire, copiez les données dans cette nouvelle table tout en les manipulant si nécessaire pour remplir la nouvelle colonne non nullable, puis échangez la table via un changement de nom en deux étapes.

Oui, c'est plus compliqué, mais vous devrez peut-être le faire de cette façon si vous ne voulez pas de gros UPDATE sur une table live.

1
alphadogg

cette requête mettra à jour automatiquement les NULL

ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;
0
jacktrade