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);
または、 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
は引き続き有効なステートメントです。あなたの質問に答えるために:いいえ、彼らは冗長ではありません。
デフォルト値であっても、null
で列データをいつでもオーバーライドできます。
NOT NULL
の制限により、null
値で作成された行は更新できません
私のSQL教師は、DEFAULT
値とNOT NULL
or 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を防止するフェイルセーフメカニズムと考えてください。