J'ajoute une nouvelle colonne "NOT NULL" à ma base de données Postgresql en utilisant la requête suivante (filtrée pour Internet):
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) NOT NULL;
Chaque fois que j'exécute cette requête, je reçois le message d'erreur suivant:
ERROR: column "mycolumn" contains null values
Je suis perplexe. Où est-ce que je vais 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 SQL à partir de Terminal.
sql
postgresql
alter-table
Huuuze
la source
la source
man ALTER_TABLE
:)Comme d'autres l'ont observé, vous devez soit créer une colonne nullable, soit fournir une valeur DEFAULT. Si cela n'est pas assez flexible (par exemple, si vous avez besoin que la nouvelle valeur soit calculée individuellement pour chaque ligne), vous pouvez utiliser le fait que dans PostgreSQL, toutes les commandes DDL peuvent être exécutées dans une transaction:
la source
Étant donné que des lignes existent déjà dans la table, l'
ALTER
instruction tente d'insérerNULL
dans la colonne nouvellement créée pour toutes les lignes existantes. Vous devez ajouter la colonne comme autoriséNULL
, puis remplir la colonne avec les valeurs souhaitées, puis la définirNOT NULL
ensuite.la source
Vous devez soit définir une valeur par défaut, soit faire ce que Sean dit et l'ajouter sans la contrainte null jusqu'à ce que vous l'ayez remplie sur les lignes existantes.
la source
La spécification d'une valeur par défaut fonctionnerait également, en supposant qu'une valeur par défaut soit appropriée.
la source
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 la 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 une grosse MISE À JOUR sur une table en direct.
la source
cette requête mettra automatiquement à jour les valeurs nulles
la source
Cela a fonctionné pour moi: :)
la source
NOT NULL
contrainte sur votre requête. Bien sûr, cela fonctionne.