2013-11-20 59 views
0

后我有如下表:去掉括号节省表

FirstTable

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

表被创建之后,我创建CHECK约束具有以下定义:

((列1> 0和列2> 0)或列3> 0)。

当我保存表格,然后转到“管理检查约束”我看到我的约束有一点不同的定义。它看起来像这样:

([列1]>(0)和[列2]>(0)或[栏3]>(0))。

正如我们看到的,没有我在定义创建括号,和SQL等形成围绕对整个表达式括号。

为什么SQL会这样做?是否有任何理由这样做?

我问这个,因为我怕可能的情况下处于不同的方式支撑则在我的定义,这可能会导致完全不同的表达。

回答

1

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

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

我不知道究竟是如何检查约束存储,但它不是一个文本表示。这是一种更高效的数据结构,可以使检查很快完成。因此,当您要求SQL Server将它还给您时,它不知道最初使用的包围是什么 - 它只是返回一个表达式,它与您最初指定的内容等效。

你收到的是正好是相当于你原来给服务器的东西,就实际的逻辑而言将会被应用。

我问过这个问题,因为恐怕可能是在我的定义中位于不同的方式的大括号,这可能导致完全不同的表达。

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

,当然,你完全可以自由到原来的表达式存储在合适的存储库(如源代码控制系统),只是总是从他们的工作,而不是依靠什么SQL Server可以生成。