今日、会社で若手に「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以降に追加された機能です。
※訂正・補足しておきます。
どうもです。
2005年だとV8.xだと思うんで
NOT NULL制約の変更は出来ないで
合ってるんじゃないでしょうか。
http://publib.boulder.ibm.com/infocenter/db2luw/v8/topic/com.ibm.db2.udb.doc/admin/r0000888.htm?resultof=%22%41%4c%74%65%72%22%20%22%61%6c%74%65%72%22%20%22%74%61%62%6c%65%22%20
V9.x以前のALTER TABLEは、ADD COLUMN出来るけど
DROP CLOUMN出来ないとか、コントロールセンターからのプロシージャ利用でのみ出来る事があるとか色々不便だった記憶があります。
(淡い記憶で試していませんが・・こんど確認します)
komikoniさん、こんにちは。
仰るとおり、V8では出来ないみたいです。
ちゃんと動作させて裏を取りました。
V9からALTER TABLEに機能追加があって、
上記の内容ができるようになったようです。
ご指摘ありがとうございます。