ALTER TABLE dbo.OneNull WITH CHECK ADD CONSTRAINT ck_checkonechecktwo CHECK (c1 IS NOT NULL)
添加此约束将失败。
如果添加一个没有正式方向的(至少对于列检查约束),引擎 (screeeeech) 将抛出错误。
ALTER TABLE dbo.OneNull ADD CONSTRAINT ck_checkornocheck CHECK (c1 IS NOT NULL)
您可以通过可信约束获得的优化类型示例如下:
ALTER TABLE dbo.OneNull WITH CHECK ADD CONSTRAINT ck_checkonechecktwo CHECK (c1 <= 1)
INSERT dbo.OneNull ( c1 )
VALUES (1)
SELECT *
FROM dbo.OneNull AS onu
WHERE onu.c1 > 2
AND 1 = 1 --this is added to prevent a trivial plan
问题:
SQL Server 中的一个简单示例是禁止 NULL 的约束。
创建一个表并插入两行,一行不为空,一行为空。
ALTER TABLE
语法可以指导创建约束时发生的情况。使用WITH NOCHECK
将告诉引擎 (vroom vroom) 不要检查列内容,而只是为未来的行添加约束。添加此约束成功运行,但这意味着该约束不受信任,并且您失去了某些查询优化。例如,如果这是一个外键,您将失去连接消除。对于列约束,如果约束信息告诉优化器搜索不会产生任何结果,则优化器可以跳过任何工作周期。
但是现在这个插入失败了:
您还可以在添加约束时指示引擎(哔哔)检查列值。
添加此约束将失败。
如果添加一个没有正式方向的(至少对于列检查约束),引擎 (screeeeech) 将抛出错误。
您可以通过可信约束获得的优化类型示例如下:
引擎 (honk honk) 完全没有查找值,而是知道由于受信任的约束,这样的值不存在。优化器并没有将“真正的”查询计划放在一起并读取任何数据,而是短路并使用 Constant Scan 运算符返回 NADA!