2012-08-08 10 views
47

私が作成/変更するDDL文で列を定義して何度も次の構文を見てきました:質問があるSQLカラム定義:デフォルト値で、nullではない冗長?

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

を:デフォルト値が指定されているので、それはまた、その列を指定する必要がありますNULLを受け入れるべきではありませんか?つまり、DEFAULTはNOT NULLを冗長にレンダリングしませんか?

答えて

69

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 NULLDEFAULTは冗長ではありません。特に、NOT NULL can have a tremendous impact on query performance as explained in this blog post here

8

デフォルト値の場合でも、いつでも列データをnullで上書きできます。

NOT NULL制限がnull

+0

:の "それはNULL値を使用して作成された後にNOT NULL制約を使用すると、その行を更新させません" NOT NULL列のコース行は更新できますが、その列の値としてnullで更新することはできません。 さらに、行の作成とは行の挿入を意味します。INSERTステートメントは、NOT NULLで指定された列に対してもNULL値を持つことはできません。 – makrom

0

私はそうではありません。

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

nullを設定しないと、エラーが発生するため、フィールドにnull値を挿入できません。

ヌルを防ぐためのフェールセーフメカニズムと考えてください。

1

マイ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

+1

ねえ、参加してくれてありがとう。これは当面の問題には対処していませんが、両方の順序は完全に有効です。 NULLとNOT NULLの値がより良く整列するため、テーブルを手動でスクリプト化しているときに、デフォルトで最後に置く方が簡単です。 – emragins

+0

さて、あなたも正しいと思います。なぜ私のコースは明白に私が私の答えに書いたことを言うのか分からない。 私の答えは本当に問題には触れていませんが、コメントはあまり読みにくくないことがわかりました。 –

+0

(主観的な)ベストプラクティスとルールには違いがあります。一貫したスタイルを持つことは悪い考えではありませんが、この特定のケースでは、私は個人的にDEFAULTの前にNULLを使用しないことを好みます。 それにかかわらず、回答の代わりにコメントを書くこともできます。これはより適切なものでした。 – makrom

関連する問題