保存表后删除CHECK约束定义中的大括号

时间:2013-11-20 14:08:47

标签: sql sql-server-2012 constraints

我有一张桌子:

FirstTable

Id int PRIMARY KEY NOT NULL,
Column1 int NOT NULL ,
Column2 int NOT NULL ,
Column3 int NOT NULL

创建表后,我使用以下定义创建CHECK约束:

((Column1> 0 AND Column2> 0)或Column3> 0)。

保存表格后,转到“管理检查约束”,我发现我的约束定义很少。它看起来像这样:

([Column1]>(0)AND [Column2]>(0)OR [Column3]>(0))。

正如我们所看到的,我在定义中没有创建大括号,而SQL在整个表达式中形成了另外一对大括号。

为什么SQL会这样做?这样做有什么理由吗?

我问这个是因为我担心在我的定义中可能会出现以不同方式放置牙箍的情况,这可能导致完全不同的表达。

2 个答案:

答案 0 :(得分:1)

AND的优先级高于OR,因此在这种情况下,大括号是多余的。 但我认为你可以这样试试:

(Column1 > 0 AND Column2 > 0) OR (Column3 > 0)

答案 1 :(得分:1)

我不确切知道如何存储检查约束,但它不是文本表示。它是一种更有效的数据结构,可以非常快速地完成检查。因此,当您要求SQL Server将其返还给您时,它并不知道您最初使用的包围 - 它只返回一个表达式,该表达式是您最初指定的等效

根据将要应用的实际逻辑,您收到的完全等同于您最初提供给服务器的内容。

  

我问这个是因为我担心在我的定义中可能会出现以不同方式放置牙箍的情况,这可能导致完全不同的表达。

它不会成功。它(逻辑上)是相同的表达式,但如果你想看到这种逻辑等价,你可能需要自己进行一些重新排列。

当然,您可以完全自由地将原始表达式存储在合适的存储库(例如源代码管理系统)中,并始终使用它们,而不是依赖于SQL Server可以生成的内容。 / p>