当我CHECK CONSTRAINT
在表上定义 a 时,我发现存储的条件子句可能与我输入的不同。
例子:
Alter table T1 add constraint C1 CHECK (field1 in (1,2,3))
查看存储的内容:
select cc.Definition from sys.check_constraints cc
inner join sys.objects o on o.object_id = cc.parent_object_id
where cc.type = 'C' and cc.name = 'T1';
我懂了:
([field1]=(3) OR [field1]=(2) OR [field1]=(1))
虽然这些是等价的,但它们不是相同的文本。(使用BETWEEN
子句时会发生类似的行为)。
我希望这不会发生的原因是,我试图CHECK
通过将用于定义约束的文本与存储的文本进行比较,以编程方式确保我的所有约束都是正确的sys.check_constraints
——如果不同,则删除并重新创建约束。
但是,在这些情况下,它们总是不同的,因此程序总是认为它需要重新创建约束。
问题是:
- SQL Server 进行这种翻译有什么已知的原因吗?它只是删除了一些语法糖并以更简单的形式存储子句吗?
- 有没有办法避免这种行为(除了以长格式编写我的约束子句以匹配 SQL Server 将其更改为的内容)?
- 有没有另一种方法来判断我的检查约束是否“过时”并且需要重新创建?