web-dev-qa-db-ja.com

nullを許可しないPostgresqlデータベースに列を追加するにはどうすればよいですか?

次のクエリ(インターネット用にサニタイズ)を使用して、Postgresqlデータベースに新しい「NOT NULL」列を追加しています。

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

このクエリを実行するたびに、次のエラーメッセージが表示されます。

ERROR:  column "mycolumn" contains null values

私は困惑しています。どこがおかしいの?

注:私は主にpgAdmin III(1.8.4)を使用していますが、ターミナル内からSQLを実行したときに同じエラーを受け取りました。

219
Huuuze

デフォルト値を設定する必要があります。

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;
360
Luc M

他の人が観察したように、null許容列を作成するか、DEFAULT値を提供する必要があります。それに十分な柔軟性がない場合(たとえば、新しい値を行ごとに個別に計算する必要がある場合)、PostgreSQLでは、すべてのDDLコマンドをトランザクション内で実行できるという事実を使用できます。

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

テーブルに行がすでに存在するため、ALTERステートメントは、既存のすべての行に対してNULLを新しく作成された列に挿入しようとしています。 NULLを許可するように列を追加してから、必要な値を列に入力し、その後NOT NULLに設定する必要があります。

48
Sean Bright

デフォルトを定義するか、既存の行に入力するまで、Seanの言うことを実行し、null制約なしでそれを追加する必要があります。

5
Paul Tomblin

デフォルト値が適切であると仮定すると、デフォルト値の指定も機能します。

2
Ryan Graham

または、追加の列を持つtempとして新しいテーブルを作成し、null不可の新しい列を埋めるために必要に応じて操作しながらこの新しいテーブルにデータをコピーし、2段階の名前変更によってテーブルを交換します。

はい、より複雑ですが、ライブテーブルで大きなUPDATEが必要ない場合は、この方法で行う必要があります。

1
alphadogg

このクエリはnullを自動更新します

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