次のクエリ(インターネット用にサニタイズ)を使用して、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を実行したときに同じエラーを受け取りました。
デフォルト値を設定する必要があります。
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;
他の人が観察したように、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;
テーブルに行がすでに存在するため、ALTER
ステートメントは、既存のすべての行に対してNULL
を新しく作成された列に挿入しようとしています。 NULL
を許可するように列を追加してから、必要な値を列に入力し、その後NOT NULL
に設定する必要があります。
デフォルトを定義するか、既存の行に入力するまで、Seanの言うことを実行し、null制約なしでそれを追加する必要があります。
デフォルト値が適切であると仮定すると、デフォルト値の指定も機能します。
または、追加の列を持つtempとして新しいテーブルを作成し、null不可の新しい列を埋めるために必要に応じて操作しながらこの新しいテーブルにデータをコピーし、2段階の名前変更によってテーブルを交換します。
はい、より複雑ですが、ライブテーブルで大きなUPDATEが必要ない場合は、この方法で行う必要があります。
このクエリはnullを自動更新します
ALTER TABLE mytable ADD COLUMN mycolumn character varying(50) DEFAULT 'whatever' NOT NULL;