102

create /alterDDLステートメントの列を定義する次の構文を何度も見てきました。

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

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

4

6 に答える 6

146

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

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標準に従って、DEFAULTinステートメントを使用することもできます。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はまだ有効です。あなたの質問に答えるには:いいえ、それらは冗長ではありません。

于 2012-08-08T10:08:47.503 に答える
25

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

制限により、値で作成された後にその行を更新することはNOT NULLできませんnull

于 2012-08-08T10:06:47.043 に答える
3

私はそうは言いません。

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

null が設定されていないと、エラーがスローされるため、null 値をフィールドに挿入することはできません。

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

于 2012-08-08T10:08:53.470 に答える