КаталогИндекс раздела
НазадОглавлениеВперед


2.5 Ограничения целостности

В предыдущих разделах мы упоминали ограничения таблицы и ограничения столбца. В обоих случаях речь идет об ограничениях целостности. Ограничения целостности проверяются для каждой строки при каждом добавлении строк в таблицу или при изменении значений в строках (ссылочные ограничения - также и при удалении строк). Те операции, выполнение которых может привести к нарушению ограничений, не выполняются.

Два вида ограничений (столбцовые и табличные) различаются тем, что в ограничениях столбца могут фигурировать только значения одного данного столбца, а в ограничениях таблицы могут фигурировать разные столбцы этой таблицы. Столбцовые ограничения могут быть перенесены в табличные.

Синтаксис ограничений целостности показан на рис.2.4.


Рисунок 2.4 - Синтаксис ограничений целостности

Как видно из синтаксических диаграмм, в табличных ограничениях задается список имен столбцов, к которым это ограничение относится. Столбцовые ограничения соотносятся с тем столбцом, в определении которого они применены.

Ограничение может быть именованным или неименованным. Если мы даем ограничению имя, то впоследствии мы можем управлять применением ограничения (отключать и включать его), используя это имя. Если же необходимости в таком управлении не предвидится, синтаксическая конструкция именования может быть опущена; в этом случае СУБД сама формирует имя ограничения.

Смысл ограничений следующий.

Ограничение NOT NULL - запрет неопределенного значения в данном столбце. Если для столбца описано значение по умолчанию, то занесение в столбец значения NULL приведет к занесению в него значения по умолчанию. Если значение по умолчанию не задано, то операция, записывающая в столбец значение NULL, не выполнится.

Ограничение PRIMARY KEY - ограничение первичного ключа. Если первичным ключом является один столбец, то ограничение может задаваться в определении столбца. Если первичный ключ составной, то это ограничение может быть только табличным. Только один первичный ключ может быть задан для таблицы. В стандарте языка и в Oracle ограничение PRIMARY KEY автоматически подразумевает и ограничение NOT NULL. В DB2 NOT NULL обязательно должно указываться явно вместе с PRIMARY KEY.

Ограничение UNIQUE - ограничение потенциального ключа. Таких ограничений может быть задано несколько. Существуют разночтения в семантике ограничения уникальности. Стандарт языка предполагает, что потенциальный ключ может иметь и пустое значение, но в таблице может существовать только одна строка с пустым значением в этом столбце. Oracle допускает наличие в таблице любого числа строк с пустым значением в этом столбце, уникальными должны быть только непустые значения. В DB2 ограничение UNIQUE обязательно применяется вместе с NOT NULL.

Ограничение CHECK задает некоторые условия, которым должно соответствовать значение в столбце или соотношения значений в двух или более столбцах. Синтаксис условия в выражении CHECK - тот же, что и условия в фразе WHERE (см. п.3.1.5) но в нем:

Выражения FOREIGN KEY и REFERENCES определяют ссылочные ограничения целостности. Столбец или столбцы, на которые ссылаются такие ограничения, должны быть уникальными (описанными с ограничениями PRIMARY KEY или UNIQUE).

Подвыражения ON UPDATE и ON DELETE в составе ссылочного ограничения целостности определяют действия при удалении или изменении столбца (или столбцов), на который ссылается внешний ключ:

По умолчанию предполагается: ON UPDATE RESTRICT ON DELETE RESTRICT.

Перечисленный набор действий определяется стандартом, но в реальных СУБД он реализуется далеко не полностью.

В DB2 для удаления могут задаваться действия: RESTRICT (по умолчанию)/NO ACTION/CASCADE/ SET NULL, а для изменения - RESTRICT (по умолчанию)/NO ACTION. Разница между RESTRICT и NO ACTION состоит в том, что первое проверяется перед всеми остальными ограничениями, а второе - после.

В Oracle для изменения допускается только действие RESTRICT, а для удаления - RESTRICT и CASCADE. Поскольку RESTRICT является действием по умолчанию, единственно возможная конструкция, которая может употребляться в Oracle, - ON DELETE CASCADE.


НазадОглавлениеВперед
КаталогИндекс раздела