web-dev-qa-db-ja.com

SQL列の定義:デフォルト値であり、null冗長ではありませんか?

Create/alter DDLステートメントの列を定義する次の構文を何度も見ました。

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

問題は、デフォルト値が指定されているため、列がNULLを受け入れないように指定する必要があるかどうかです。つまり、DEFAULTはNOT NULLを冗長にしないのですか?

66
Razvan

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);

または、 SQL-1992 標準に従って、DEFAULTステートメントでUPDATEを使用することもできます。

-- 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は引き続き有効なステートメントです。あなたの質問に答えるために:いいえ、彼らは冗長ではありません。

94
Lukas Eder

デフォルト値であっても、nullで列データをいつでもオーバーライドできます。

NOT NULLの制限により、null値で作成された行は更新できません

15
Tamir

私のSQL教師は、DEFAULT値とNOT NULLor NULLの両方を指定する場合、NOT NULLまたはDEFAULTの前にNULLを常に表現する必要があると述べました。

このような:

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

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

私はそうは言いません。

列がnull値を受け入れる場合、null値をフィールドに挿入するのを止めるものは何もありません。私の知る限り、デフォルト値は新しいルールの作成時にのみ適用されます。

Null以外を設定すると、フィールドにnull値を挿入できず、エラーがスローされます。

Nullを防止するフェイルセーフメカニズムと考えてください。

0
Dark Hippo