Identity列是否会被视为具有空值的主键?

时间:2014-06-24 07:41:14

标签: sql sql-server

我使用以下命令创建了两个表:

select top 20 ord_pk into temporders from orders

select top 20 ord_pk into temporders1 from orders

现在我更改了temporders1表的not null约束,以允许空值和更新的最后5行temporders1表为NULL。

现在当我执行以下查询时:

select ord_pk
from temporders
where temporders.ord_pk not in
(
select ord_pk from temporders1
)

它没有输出任何行作为输出。

当我删除temporders1表中具有空值的所有行时,它将从temporders表中返回最后5个Ord_Pk。

我无法弄清楚它为什么这样做,因为我之前已经检查过任何表(temporders和temporders1)上没有主键或任何其他约束。

请帮助我理解背后的逻辑。

1 个答案:

答案 0 :(得分:0)

检查此StackOverflow问题:NOT IN clause and NULL values

没有正确实现(例如,使用NULL函数),

ISNULL()值不能在谓词中使用,因为它们总是计算为UNKNOWN,而谓词包含UNKNOWN结果,它也计算为UNKNOWN。

你可以通过运行这个简单的查询来证明我在说什么:

SELECT CASE WHEN NULL=NULL  THEN 'equals'
            WHEN NULL<>NULL THEN 'not equal'
            WHEN NULL<NULL  THEN 'less than'
            WHEN NULL>NULL  THEN 'greater than'
            ELSE 'unknown' END

请注意,我所说的仅对服务器属性ANSI_NULLS的默认值有效。将ANSI_NULLS设置为OFF将产生不同的行为。