create / alterDDLステートメントの列を定義する次の構文を何度も見てきました。
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
またNULL
はの両方を指定する場合は、DEFAULT
常にNOT NULL
またはの前に表現する必要があると言いました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を防ぐためのフェイルセーフメカニズムと考えてください。
言い換えれば、DEFAULTはNOT NULLを冗長にしませんか?
いいえ、冗長ではありません。受け入れられた答えを拡張する。カラム用col
null許容の場合、DEFAULTが定義されている場合でも、畏敬の念を起こしてNULLを挿入できます。
CREATE TABLE t(id INT PRIMARY KEY, col INT DEFAULT 10);
-- we just inserted NULL into column with DEFAULT
INSERT INTO t(id, col) VALUES(1, NULL);
+-----+------+
| ID | COL |
+-----+------+
| 1 | null |
+-----+------+
Oracleは、このようなシナリオに追加の構文を導入して、デフォルトで明示的なNULLをオーバーライドしました。 DEFAULT ON NULL
。
CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10);
-- same as
--CREATE TABLE t2(id INT PRIMARY KEY, col INT DEFAULT ON NULL 10 NOT NULL);
INSERT INTO t2(id, col) VALUES(1, NULL);
+-----+-----+
| ID | COL |
+-----+-----+
| 1 | 10 |
+-----+-----+
ここではNULLを挿入しようとしましたが、代わりにデフォルトを取得しました。
ON NULL句を指定すると、後続のINSERTステートメントがNULLと評価される値を割り当てようとするときに、OracleDatabaseはDEFAULT列の値を割り当てます。
ON NULLを指定すると、NOTNULL制約とNOTDEFERRABLE制約状態が暗黙的に指定されます。