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.
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;
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;
É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.
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.
Spécifier une valeur par défaut fonctionnerait également si une valeur par défaut était appropriée.
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.
cette requête mettra à jour automatiquement les NULL
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;