1. ホーム
  2. sql

[解決済み] SQLカラム定義:デフォルト値とnot nullは冗長?

2022-12-23 09:46:22

質問

create/alter DDL ステートメントでカラムを定義する以下の構文を何度も目にしたことがあります。

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"

問題は、デフォルト値が指定されているので、カラムがNULLを受け入れないように指定する必要があるかどうかです。言い換えれば、DEFAULT は NOT NULL を冗長にしませんか?

どのように解決するのですか?

DEFAULT は、挿入/更新ステートメントで明示的な値がない場合に挿入される値です。あなたのDDLに NOT NULL 制約がなかったとします。

ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT 'MyDefault'

そして、以下のようなステートメントを発行することができます。

-- 1. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B) VALUES (NULL, NULL);

-- 2. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, DEFAULT);

-- 3. This will insert 'MyDefault' into tbl.col
INSERT INTO tbl (A, B, col) DEFAULT VALUES;

-- 4. This will insert NULL into tbl.col
INSERT INTO tbl (A, B, col) VALUES (NULL, NULL, NULL);

また、この他に DEFAULTUPDATE ステートメントによると SQL-1992 標準に従います。

-- 5. This will update 'MyDefault' into tbl.col
UPDATE tbl SET col = DEFAULT;

-- 6. This will update NULL into tbl.col
UPDATE tbl SET col = NULL;

すべてのデータベースが、これらの標準SQL構文をすべてサポートしているわけではないことに注意してください。このため NOT NULL 制約を追加すると、ステートメントでエラーが発生します。 4, 6 という制約があります。 1-3, 5 はまだ有効なステートメントです。ですから、あなたの質問に答えます。いいえ、それらは冗長ではありません。