Определение ограничений целостности
В стандарте SQL/92 специфицированы две разновидности ограничений целостности - привязанные к определению таблиц (табличные ограничения) и определяемые независимо (утверждения целостности - assertions). Табличные ограничения похожи на соответствующие средства SQL/89, но на самом деле существенно более развиты. Поэтому мы достаточно подробно рассмотрим эти механизмы. Аналогов утверждений целостности в языке SQL/89 не было.
Общие синтаксические правила определения табличных ограничений выглядят следующим образом:
<table constraint definition> ::= [ <constraint name definition> ] <table constraint> [ <constraint attributes> ] <table constraint> ::= <unique constraint definition> |<referential constraint definition> |<check constraint definition>
Синтаксические правила разделов определения имени и атрибутов ограничения приведены в п.3.5.1.
Пояснения:
Ограничение уникальности определяется следующими синтаксическими правилами:
<unique constraint definition> ::= <unique specification> <left paren> <unique column list> <right paren> <unique specification> ::= UNIQUE | PRIMARY KEY <unique column list> ::= <column name list>
Пояснения:
Ссылочное ограничение определяется следующими синтаксическими правилами:
<referential constraint definition> ::= FOREIGN KEY <left paren> <referencing columns> <right paren> <references specification> <references specification> ::= REFERENCES <referenced table and columns> [ MATCH <match type> ] [ <referential triggered action> ] <match type> ::= FULL PARTIAL <referencing columns> ::= <reference column list> <referenced table and columns> ::= <table name> [ <left paren> <reference column list> <right paren> ] <reference column list> ::= <column name list> <referential triggered action> ::= <update rule> [ <delete rule> ] |<delete rule> [ <update rule> ] <update rule> ::= ON UPDATE <referential action> <delete rule> ::= ON DELETE <referential action> <referential action> ::= CASCADE |SET NULL |SET DEFAULT |NO ACTION
Пояснения:
(a) если ссылающаяся таблица является постоянной базовой, то и таблица, на которую указывает ссылка, должна быть постоянной базовой;
(b) если ссылающаяся таблица является глобальной временной, то и таблица, на которую указывает ссылка, должна быть глобальной временной;
(c) если ссылающаяся таблица является создаваемой локальной временной, то и таблица, на которую указывает ссылка, должна быть создаваемой локальной временной;
(d) если ссылающаяся таблица является объявляемой локальной временной, то таблица, на которую указывает ссылка, должна быть либо глобальной временной, либо создаваемой локальной временной, либо объявляемой локальной временной.
(a) тип соответствия (matchtype) не указан, и для каждой строки ссылающейся таблицы истинно условие RfMATCH (SELECTRtFROMT);
(b) указан тип соответствия PARTIAL, и для каждой строки ссылающейся таблицы истинно условие RfMATCHPARTIAL (SELECTRtFROMT);
(c) указан тип соответствия FULL, и для каждой строки ссылающейся таблицы истинно условие RfMATCHFULL (SELECTRtFROMT).
для данной строки таблицы, на которую указывает ссылка, соответствующими являются все строки ссылающейся таблицы, содержащие по крайней мере одно не неопределенное значение ссылающегося столбца, причем все не неопределенные значения столбцов этих строк совпадают со значениями соответствующих столбцов строки, на которую указывает ссылка;
для данной строки таблицы, на которую указывает ссылка, уникально соответствующими являются все соответствующие только ей строки; другие соответствующие строки называются неуникально соответствующими.
(a) если тип соответствия не специфицирован или если специфицирован тип соответствия FULL, то
(i) если в правиле удаления указано CASCADE, то все соответствующие строки помечаются для удаления;
(ii) если в правиле удаления указано SETNULL, то во всех соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;
(iii) если в правиле удаления указано SETDEFAULT, то во всех соответствующих строках в каждый ссылающийся столбец заносится соответствующее значение по умолчанию;
(b) если специфицирован тип соответствия PARTIAL, то
(i) если в правиле удаления указано CASCADE, то все уникально соответствующие строки помечаются для удаления;
(ii) если в правиле удаления указано SETNULL, то во всех уникально соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;
(iii) если в правиле удаления указано SETDEFAULT, то во всех уникально соответствующих строках в каждый ссылающийся столбец заносится соответствующее значение по умолчанию.
(a) если тип соответствия не специфицирован или если специфицирован тип соответствия FULL, то
(i) если в правиле удаления указано CASCADE, то во всех соответствующих столбцах проставляется то же самое новое значение;
(ii) если в правиле модификации указано SETNULL, то
(*) если тип соответствия не указан, то во всех соответствующих строках в ссылающийся столбец, соответствующий измененному столбцу таблицы, на которую указывает ссылка, выставляется неопределенное значение;
(**) если указан тип соответствия FULL, то во всех соответствующих строках в каждый ссылающийся столбец заносится неопределенное значение;
(iii) если в правиле модификации указано SETDEFAULT, то во всех соответствующих строках в ссылающийся столбец, соответствующий измененному столбцу таблицы, на которую указывает ссылка, заносится значение по умолчанию;
(b) если указан тип соответствия PARTIAL, то
(i) если в правиле модификации указано CASCADE, то для каждой уникально соответствующей строки, содержащей не неопределенное значение в ссылающемся столбце C1, который соответствует изменяемому столбцу C2, в столбец C1 заносится новое значение столбца C2;
(ii) если в правиле модификации указано SETNULL, то во всех уникально соответствующих строках, содержащих не неопределенное значение в ссылающемся столбце, который соответствует изменяемому столбцу, проставляется неопределенное значение;
iii) если в правиле модификации указано SETDEFAULT, то во всех уникально соответствующих строках, содержащих не неопределенное значение в ссылающемся столбце, который соответствует изменяемому столбцу, проставляется значение по умолчанию;
Проверочное ограничение целостности определяется следующим синтаксическим правилом:
<check constraint definition> ::= CHECK <left paren> <search condition> <right paren>
Пояснения:
Утверждения целостности определяются следующими синтаксическими правилами:
<assertion definition> ::= CREATE ASSERTION <constraint name> <assertion check> [ <constraint attributes> ] <assertion check> ::= CHECK <left paren> <search condition> <right paren>
Пояснения: