在创建此检查约束(在 SQL 服务器中)之后,我很惊讶地看到:
ALTER TABLE [dbo].[MYTABLE]
ADD CONSTRAINT MyConstraint
CHECK (MyColumn >0);
Run Code Online (Sandbox Code Playgroud)
我能够添加一个具有 NULL 值的元素:
insert into dbo.MYTABLE(MyColumn) values(NULL);
Run Code Online (Sandbox Code Playgroud)
...这实际上是我想要防止的:)
我不得不将我的约束修改为:
ALTER TABLE [dbo].[MYTABLE]
ADD CONSTRAINT MyConstraint
CHECK (MyColumn IS NOT NULL);
Run Code Online (Sandbox Code Playgroud)
第二个版本正确地阻止了我插入带有 MyColumn = NULL 的元素。
是的,在这个例子中,我可以将 MyColumn 设置为“NOT NULL”。但我真正的问题包括其他条件,其中 MyColumn 可能为空,必须包含在约束中。我将我的问题缩小到下面的代码,这对我来说实际上似乎不合逻辑。
看起来 SQL SERVER 将 NULL 值视为 > 0?? 但是,当您运行时,情况并非如此:
SELECT * from MyTable where MyColumn >0;
Run Code Online (Sandbox Code Playgroud)
它适当地排除了 NULL 值。那么为什么检查约束的行为会有所不同???
没有 SQL Server 会将 NULL 视为 NULL。如果要防止插入 NULL,请将该列设置为 NOT NULL。针对 NULL 值的任何类型的相等检查都将始终返回 NULL。它不能大于 0、小于 0 或等于 0,因为该值未知。
| 归档时间: |
|
| 查看次数: |
1884 次 |
| 最近记录: |