2017-11-27 4 views
1

私は奇妙な問題に気づいたSQL Server 2016データベースを持っている、またはおそらく私は何かが不足しています。 varchar列にNOT NULL主キーを持つテーブルでNULLレコードで奇妙なプライマリキーの問題SQL Server

Iが値NとINSERTを入力した場合、NULL値は「」一度許可されています。どこで私はすぐにその列にNULLを使用すると、それはエラーをスローするNULLを挿入することはできません。

は、主キー列のN「」と考え、いくつかの有効な文字ですか?

ここに問題を再現するTSQLがあります。

CREATE TABLE [dbo].[testprmarykeynull]( 
[EmailId] [varchar](20) NOT NULL PRIMARY KEY CLUSTERED 
( 
[EmailId] ASC 
) 
) 


INSERT INTO testprmarykeynull VALUES('[email protected]'); 
INSERT INTO testprmarykeynull VALUES(N''); - Successfully insert this for the first time and the second time throws duplicate error. But from my understanding this should fail the first time itself since it's a NULL value. 
INSERT INTO testprmarykeynull VALUES(NULL); - Fails though even if I try with the first NULL 

答えて

3

MS SQL Serverの空の文字列がnull、例えばとは違って)ではありません - デモのために、このSQLFiddleを参照してください。

したがって、それは他の値のように振る舞う - あなたは主キー列に挿入する最初のものだけで罰金になります、そしてそれは、列の一意性に違反するため、もう一つは失敗します。

+0

''あなたはNULL'に言及された第2 one'右?主キーnot nullの制約に違反するはずです – Squirrel

+0

@Squirrel no - 空の文字列( '' '')を挿入しようとしたのは2度目です。あなたが初めて成功した時、空の文字列**をもう一度挿入しようとすると**、それは一意性に違反するので失敗します。明確化のために – Mureinik

+0

ありがとうございます。 – Squirrel

3

NULLN''は、SQL Serverで間違いなく同じではありません - 彼らはされてなかったで、彼らはなりませんでした。

N''は長さ0
NULLのNVARCHAR値は「値が存在しないこと」です。

この違いが明確になる方法はたくさんあります。
例:

SELECT LEN(N'')  -- returns 0 
    , LEN(NULL)  -- returns NULL because almost any operation on NULL returns NULL 

    , ISNULL(N'' , N'Hello') -- returns N'' because N'' is a value 
    , ISNULL(NULL, N'Hello') -- returns N'Hello' because NULL is "not a value"