2016-05-10 19 views
3

SQL Serverにvarchar(50)で非NULL列として設定された列を持つテーブルがあります。この列は主キーではありません。SQL Server - 空でない列に空白を挿入できるのはなぜですか?

Cannot insert the value NULL into column. Column does not allow nulls. INSERT fails.

期待されている:私は、ヌル挿入をしようとした場合

は、私はエラーを取得します。

私は ''を挿入しようとすると同じことが予想されますが、何らかの理由で問題なく空白を許可しています。どうして?テーブルでこの特定の列に空白を許可しないようにするにはどうすればよいですか?私はデフォルト値を必要としません、私はnullが失敗するのと同じ方法で失敗する挿入します。

は、私はステーキが、ベジタリアンをしたいあなたに

+1

なぜ?、空の文字列は、実際の値ではなく、 'NULL'あるので、それは非常に簡単だ – Lamak

答えて

8

空の文字列は、NULLの値とは異なるものです。 NULLは実際には利用できない、知られていないことを意味します。空の文字列がNULL値ではありませんので

ALTER TABLE mytable ADD CONSTRAINT CHK_EmptyString CHECK (myCol <> '') 
+0

場合、正確にわかりませんか? OPは恐らく空ではなくヌルではないでしょう。 'LEN'は彼らのためにそれを整えるでしょう。 'constraint superNull check NULLIF(len(myCol)、0)IS NOT NULL'のようなものでしょうか? – TheNorthWes

-2

I would expect the same to be true if I tried to insert a ''

ありがとうございます。 ITは何の感覚もない - 「同じ」(つまり同じエラー)という用語ではなく、ヌルはスペースではない。

類似しています。しかし、そこにはスペースが必要な場合があります。あなたとは違う?なぜチェック制約を設定しないのですか?これは、値を特定の値に制限する方法です。

+0

それは何の意味が適切でない可能と言って、すべてのキャップは、あなたが' NULLIF'を使用することができ – TheNorthWes

3

[I] would expect the same to be true if I tried to insert a '' but for some reason it is allowing blanks without an issue. Why?

空の文字列がnullではないため、

空の文字列を停止する場合は、check constraintを使用できます。

1

はあなたが後にしている機能を実装するためにCHECK制約を追加することができます。

テーブル/列にCHECK制約を追加して、目的の結果を得ることができます。

create table #a(name nvarchar(20)) 

alter table #a add check (name != '') 

ちなみに、このチェックでもスペースだけの文字列は禁止されます。

insert into #a(name) values ('') 

insert into #a(name) values (' ') 

insert into #a(name) values (' ') 

Msg 547, Level 16, State 0, Line 1 
The INSERT statement conflicted with the CHECK constraint "CK__#a__________name__1CA18AD3". The conflict occurred in database "tempdb", table "dbo.#a__________________________________________________________________________________________________________________0000000BF04A", column 'name'. 
The statement has been terminated. 

EDIT:スペースのみの挿入を許可する制約。

ALTER TABLE #a ADD CHECK (name != '' or charindex(' ',name) = 1) 
関連する問題