create /alterDDLステートメントの列を定義する次の構文を何度も見てきました。
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
問題は、デフォルト値が指定されているため、列がNULLを受け入れないように指定する必要があるかどうかです。言い換えれば、DEFAULTはNOT NULLを冗長にしませんか?
create /alterDDLステートメントの列を定義する次の構文を何度も見てきました。
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
問題は、デフォルト値が指定されているため、列がNULLを受け入れないように指定する必要があるかどうかです。言い換えれば、DEFAULTはNOT NULLを冗長にしませんか?
DEFAULT
挿入/更新ステートメントに明示的な値がない場合に挿入される値です。NOT NULL
DDL に制約がなかったと仮定します。
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
inステートメントを使用することもできます。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
私はそうは言いません。
列が null 値を受け入れる場合、null 値をフィールドに挿入することを止めるものは何もありません。私の知る限り、デフォルト値は新しい行の作成時にのみ適用されます。
null が設定されていないと、エラーがスローされるため、null 値をフィールドに挿入することはできません。
null を防止するためのフェイル セーフ メカニズムと考えてください。