2013-04-26 228 views
-1

我有一个只有1个主列(nvarchar)的表,如在设计器中那样,它被标记为主键并且不允许空值。但以某种方式,该表中有一行的键值为空,当然不是空值,并且不会与主键列中的任何其他行重复,也不会发生冲突或违规行为。为什么主键列在SQLite中是空的?

但据我所知,SQL Server中的主列不允许这种类型的值(空)。我想知道是否有任何选项可以让它正常工作。或者我必须通过CHECK约束或C#代码中的权限(在更新之前)检查自己的值。

您的帮助将不胜感激。谢谢!

回答

2

“空字符串”是长度为零的字符串。它不是NULL,所以它不会违反空检查。它肯定是SQL Server中基于字符的主键列的允许值。如果业务不允许使用空字符串值,则检查约束将是实现此业务规则的最佳方式。这样,可能不知道规则的客户不能违反规则。

此代码在SQL Server中运行时没有违规,我只是对其进行了测试。

create table TestTable (
    myKey varchar(10) primary key, 
    myData int 
) 
GO 

insert TestTable 
select '', 1 
+0

那么,使用代码测试不是我所做的,我使用Designer进行测试,它显示了一个错误对话框。如果是这样,它与SQL Server没有区别。但是,选项或设置如何? (在考虑检查约束或其他数据验证之前)。谢谢! – 2013-04-26 22:41:28

+0

有一个选项会导致NULL在字符串连接操作中被当作空字符串处理,但对于表格没有任何相似之处。可能您正在使用的表编辑器在提交更新之前将空转换为空 - 这是工具行为,所以我不知道如何解决该问题。你可以用这个工具编写更新脚本,看看SQL究竟是什么。请记住所有这些工具通过发送普通的旧SQL到服务器上工作。如果你可以以某种方式拦截(就像分析器),那么你可以看到它在做什么。 – Jasmine 2013-04-26 22:47:45

+0

哦顺便说一句 - 使用设计人员在学习SQL时会伤到你 - 你需要学习手写SQL代码。在那个时候,设计师变得或多或少没有用处,因为你的代码编写速度比你的鼠标快得多。 – Jasmine 2013-04-26 22:51:14