Удалены фигурные скобки в определении CHECK Constraints после сохранения таблицы.

У меня есть следующая таблица:

Первая таблица

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 это делает? Есть ли причина для этого?

Я спросил об этом, потому что боюсь, что могут возникнуть ситуации, когда фигурные скобки расположены не так, как в моем определении, что может привести к совершенно другому выражению.


person veljasije    schedule 20.11.2013    source источник


Ответы (2)


Приоритет AND выше, чем OR, поэтому в этом случае фигурные скобки излишни. Но я думаю, что вы могли бы попробовать это так:

(Column1 > 0 AND Column2 > 0) OR (Column3 > 0)
person Mihai    schedule 20.11.2013

Я точно не знаю, как хранятся проверочные ограничения, но это не текстовое представление. Это более эффективная структура данных, позволяющая выполнять проверки очень быстро. Таким образом, когда вы просите SQL Server вернуть его вам, он не знает, какие скобки вы использовали изначально, — он просто возвращает выражение, эквивалентное тому, что вы изначально указали.

То, что вы получаете, точно эквивалентно тому, что вы изначально предоставили серверу, с точки зрения фактической логики, которая будет применяться.

Я спросил об этом, потому что боюсь, что могут возникнуть ситуации, когда фигурные скобки расположены не так, как в моем определении, что может привести к совершенно другому выражению.

Этого не будет. Это будет (логически) одно и то же выражение, но вам может потребоваться выполнить некоторую перестановку самостоятельно, если вы хотите увидеть эту логическую эквивалентность.

И, конечно же, вы совершенно свободно можете хранить исходные выражения в подходящем репозитории (например, в системе управления исходным кодом) и всегда работать с ними, а не полагаться на то, что может сгенерировать SQL Server.

person Damien_The_Unbeliever    schedule 20.11.2013