私が作成/変更するDDL文で列を定義して何度も次の構文を見てきました:質問があるSQLカラム定義:デフォルト値で、nullではない冗長?
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
を:デフォルト値が指定されているので、それはまた、その列を指定する必要がありますNULLを受け入れるべきではありませんか?つまり、DEFAULTはNOT NULLを冗長にレンダリングしませんか?
私が作成/変更するDDL文で列を定義して何度も次の構文を見てきました:質問があるSQLカラム定義:デフォルト値で、nullではない冗長?
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) NOT NULL DEFAULT "MyDefault"
を:デフォルト値が指定されているので、それはまた、その列を指定する必要がありますNULLを受け入れるべきではありませんか?つまり、DEFAULTはNOT NULLを冗長にレンダリングしませんか?
DEFAULT
が挿入/更新文で明示的な値が存在しない状態で挿入される値であると、それが作成された後、あなたがその行を更新させません。仮定しましょう、あなたのDDLはNOT NULL
制約を持っていなかった。そして、あなたはまた、これらのステートメント
-- 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);
を発行することができ
ALTER TABLE tbl ADD COLUMN col VARCHAR(20) DEFAULT "MyDefault"
、あなたもSQL-1992標準に従って、UPDATE
文でDEFAULT
を使用することができます。
-- 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
はまだ有効な文です。あなたの質問に答えてください:
いいえ、NOT NULL
とDEFAULT
は冗長ではありません。特に、NOT NULL
can have a tremendous impact on query performance as explained in this blog post here
デフォルト値の場合でも、いつでも列データをnull
で上書きできます。
NOT NULL
制限がnull
値
私はそうではありません。
カラムがnull値を受け入れる場合、フィールドにnull値を挿入することを止めるものはありません。私の知る限り、デフォルト値は新しいルールの作成にのみ適用されます。
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とNOT NULLの値がより良く整列するため、テーブルを手動でスクリプト化しているときに、デフォルトで最後に置く方が簡単です。 – emragins
さて、あなたも正しいと思います。なぜ私のコースは明白に私が私の答えに書いたことを言うのか分からない。 私の答えは本当に問題には触れていませんが、コメントはあまり読みにくくないことがわかりました。 –
(主観的な)ベストプラクティスとルールには違いがあります。一貫したスタイルを持つことは悪い考えではありませんが、この特定のケースでは、私は個人的にDEFAULTの前にNULLを使用しないことを好みます。 それにかかわらず、回答の代わりにコメントを書くこともできます。これはより適切なものでした。 – makrom
:の "それはNULL値を使用して作成された後にNOT NULL制約を使用すると、その行を更新させません" NOT NULL列のコース行は更新できますが、その列の値としてnullで更新することはできません。 さらに、行の作成とは行の挿入を意味します。INSERTステートメントは、NOT NULLで指定された列に対してもNULL値を持つことはできません。 – makrom