2011-12-05 10 views
1

NOT NULLカラムをserverというテーブルに追加したいと思います。問題は、テーブルにすでにレコードが含まれていることです。私がALTER TABLE server ADD COLUMN full_discovery_duration BIGINT NOT NULLを呼び出すと、H2はfull_discovery_durationがnullでないかもしれないと不平を言う。私はDEFAULT 0を指定して問題を回避することができますが、私は将来の挿入のためにデフォルト値を必要としません。私はどうしたらいいですか?H2:レコードがあるテーブルにNOT NULLカラムを追加する

列をデフォルトで追加し、後続の文の列定義からDEFAULT 0を削除する必要がありますか?より良い方法がありますか?

答えて

2

最初に既定値で列を追加し、既定値をnullに設定することができます。しかし、私が知る限り、デフォルト定義を取り除くことはできません。

代わりに、まずnullを許可してから値を設定し、後でNULLを許可しないでください。

drop table server; 
create table server(id int); 
insert into server values(1); 
alter table server 
    add column 
    full_discovery_duration bigint; 
update server set full_discovery_duration = 0; 
alter table server 
    alter column 
    full_discovery_duration set not null; 
+1

次の行を実行して、デフォルトの定義を取り除いています: 'ALTER TABLE server ADD COLUMN cached_discovery_duration BIGINT NOT NULL DEFAULT 0; ALTER TABLEサーバーALTER COLUMN cached_discovery_duration BIGINT NOT NULL; '最初の行は、値が '0'の列を追加します。 2行目でデフォルトが削除されます。 – Gili

0

既存の表に列を追加するときは、NULL可能列かデフォルト値を指定する必要があります。デフォルトを削除するとどういう意味ですか?あなたはnullでない列からどのように値を削除できますか?

+0

私は、後続の文の列定義から 'DEFAULT 0 'を削除する必要がありますか?その時までに、すべての行はその列に対してすでにnull以外の値を持つことが保証されます。 – Gili

+0

'alter table ... default null'を使用できます。それはデフォルトの定義を削除しませんが、効果は同じです(少なくとも私が知る限り)。 –