今日、会社で若手に「DB2では既存表の列に対してNOT NULL制約を付けられないと聞いたのですが、本当ですか?」と質問されました。
え?そんなことないでしょー、と"DB2 NOT NULL 付与"でググってみると、
検索結果のトップに質問掲示板でのやり取りがヒット。
中を覗いてみると「ALTER TABLEではできない」という結論に至っていました。
疑り深い昨今のkは気になったので自分でやってみました。
(※以下はコントロールセンターのコマンド・エディターのログ)
まず簡単な表を作成。
------------------------------ 入力コマンド ------------------------------
CREATE TABLE TEST.SAMPLETBL (COLUMN1 VARCHAR(10), COLUMN2 VARCHAR(10));
------------------------------------------------------------------------------
CREATE TABLE TEST.SAMPLETBL (COLUMN1 VARCHAR(10), COLUMN2 VARCHAR(10))
DB20000I SQL コマンドが正常に完了しました。
|
続いて定義を確認。
------------------------------ 入力コマンド ------------------------------
DESCRIBE TABLE TEST.SAMPLETBL;
------------------------------------------------------------------------------
DESCRIBE TABLE TEST.SAMPLETBL
Data type Column
Column name schema Data type name Length Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
COLUMN1 SYSIBM VARCHAR 10 0 はい
COLUMN2 SYSIBM VARCHAR 10 0 はい
2 レコードが選択されました。
|
続いて、NOT NULL属性をCOLUMN2に付与。
------------------------------ 入力コマンド ------------------------------
ALTER TABLE TEST.SAMPLETBL ALTER COLUMN2 SET NOT NULL;
------------------------------------------------------------------------------
ALTER TABLE TEST.SAMPLETBL ALTER COLUMN2 SET NOT NULL
DB20000I SQL コマンドが正常に完了しました。
|
再度定義を確認。
------------------------------ 入力コマンド ------------------------------
DESCRIBE TABLE TEST.SAMPLETBL;
------------------------------------------------------------------------------
DESCRIBE TABLE TEST.SAMPLETBL
Data type Column
Column name schema Data type name Length Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
COLUMN1 SYSIBM VARCHAR 10 0 はい
COLUMN2 SYSIBM VARCHAR 10 0 いいえ
2 レコードが選択されました。
|
続いて、NOT NULL属性をCOLUMN2から削除。
------------------------------ 入力コマンド ------------------------------
ALTER TABLE TEST.SAMPLETBL ALTER COLUMN2 DROP NOT NULL;
------------------------------------------------------------------------------
ALTER TABLE TEST.SAMPLETBL ALTER COLUMN2 DROP NOT NULL
DB20000I SQL コマンドが正常に完了しました。
|
再々度定義を確認。
------------------------------ 入力コマンド ------------------------------
DESCRIBE TABLE TEST.SAMPLETBL;
------------------------------------------------------------------------------
DESCRIBE TABLE TEST.SAMPLETBL
Data type Column
Column name schema Data type name Length Scale Nulls
------------------------------- --------- ------------------- ---------- ----- ------
COLUMN1 SYSIBM VARCHAR 10 0 はい
COLUMN2 SYSIBM VARCHAR 10 0 はい
2 レコードが選択されました。
|
当然、COLUMN2列にNULLデータの有無が付与・削除に関わってきますが、
何てことはなくV9.1ではちゃんとできます。
kも時々間違ったことを書いている場合もありますが、
この掲示板、訂正した方がいいのかな?
でも2005年だなぁ。。。
※komikoniさんからのご指摘により調査した結果、2005年当時はV8だったと思われ、
※V8で当該内容を動作させてみると、エラーとなりました。
※ALTER TABLE テーブル名 ALTER 列名 SET NOT NULLはV9以降に追加された機能です。
※訂正・補足しておきます。