【DB2】既存表の列へのNOT NULL制約の付与・削除

投稿日:

今日、会社で若手に「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以降に追加された機能です。
※訂正・補足しておきます。