292

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

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

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

ERROR:  column "mycolumn" contains null values

私は困惑しています。どこが間違っていますか?

注: 主に pgAdmin III (1.8.4) を使用していますが、ターミナル内から SQL を実行すると同じエラーが発生しました。

4

8 に答える 8

471

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

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;
于 2009-02-04T17:39:55.027 に答える
99

他の人が観察しているように、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;
于 2009-02-05T14:05:02.243 に答える
53

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

于 2009-02-04T17:35:37.250 に答える
5

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

于 2009-02-04T17:37:37.307 に答える
2

デフォルト値が適切であると仮定すると、デフォルト値を指定することもできます。

于 2009-02-04T17:41:54.960 に答える
0

または、余分な列を使用して新しいテーブルを一時的に作成し、必要に応じてデータを操作しながらこの新しいテーブルにデータをコピーして、null 非許容の新しい列を埋めてから、2 段階の名前変更を介してテーブルを交換します。

はい、もっと複雑ですが、ライブ テーブルで大きな UPDATE を行いたくない場合は、このようにする必要があるかもしれません。

于 2009-02-04T17:39:47.880 に答える
-10

これは私のために働いた: :)

ALTER TABLE your_table_name ADD COLUMN new_column_name int;
于 2017-02-09T06:20:43.873 に答える