Введение в стандарты языка баз данных SQL

Определение ограничений целостности


В стандарте 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.

Пояснения:

  • Если атрибуты ограничения не специфицированы, то неявно предполагается наличие атрибута INITIALLYIMMEDIATENOTDEFERRABLE.
  • Если не специфицировано определение имени ограничения, то неявно предполагается наличие определения имени ограничения с именем, зависящим от реализации.
  • Ограничение уникальности определяется следующими синтаксическими правилами:

    <unique constraint definition> ::= <unique specification> <left paren> <unique column list> <right paren> <unique specification> ::= UNIQUE | PRIMARY KEY <unique column list> ::= <column name list>

    Пояснения:

  • Пусть T обозначает таблицу, для которой определяется ограничение уникальности, а UCL - список столбцов уникальности.
  • Если в спецификации уникальности содержится ключевое слово PRIMARYKEY, то пусть SC обозначает условие поиска UNIQUE (SELECTUCLFROMT) AND (UCL) ISNOTNULL
  • Если в спецификации уникальности содержится ключевое слово UNIQUE, то пусть SC обозначает условие поиска UNIQUE (SELECTUCLFROMT)
  • Определение таблицы должно содержать не более одного явного или неявного определения ограничения уникальности со спецификацией PRIMARYKEY.
  • Ограничение уникальности не удовлетворяется в том и только в том случае, когда истинно условие EXISTS (SELECT * FROMTWHERENOT (SC))

  • Ссылочное ограничение определяется следующими синтаксическими правилами:

    <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

    Пояснения:

  • Ссылающейся таблицей мы будем называть таблицу, фигурирующую в определении таблицы или изменении схемы таблицы (операторе ALTERTABLE). Таблицей, на которую указывает ссылка, будем называть таблицу, имя которой указывается в разделе referencedtableandcolumns. Ссылающимися столбцами будем называть столбцы, перечисленные в списке столбцов-ссылок (referencecolumnlist).
  • Если в разделе referencedtableandcolumns специфицирован список столбцов, то набор имен столбцов из этого списка должен совпадать с набором столбцов уникальности, содержащемся в ограничении уникальности таблицы, на которую указывает ссылка.
  • Если раздел referencedtableandcolumns не содержит списка столбцов, то для таблицы, на которую указывает ссылка, должно быть определено ограничение уникальности с ключевым словом PRIMARYKEY.
  • Ограничение уникальности для таблицы, на которую указывает ссылка, должно не быть откладываемым.
  • Таблица, на которую указывает ссылка, должна быть базовой и,




      (a) если ссылающаяся таблица является постоянной базовой, то и таблица, на которую указывает ссылка, должна быть постоянной базовой;



      (b) если ссылающаяся таблица является глобальной временной, то и таблица, на которую указывает ссылка, должна быть глобальной временной;

      (c) если ссылающаяся таблица является создаваемой локальной временной, то и таблица, на которую указывает ссылка, должна быть создаваемой локальной временной;

      (d) если ссылающаяся таблица является объявляемой локальной временной, то таблица, на которую указывает ссылка, должна быть либо глобальной временной, либо создаваемой локальной временной, либо объявляемой локальной временной.



  • Если таблица, на которую указывает ссылка является временной со спецификацией ONCOMMITDELETEROWS, то и для ссылающейся таблицы должно быть специфицировано ONCOMMITDELETEROWS.
  • В списке ссылающихся столбцов должно содержаться то же число имен столбцов, что задается разделом referencedtableandcolumns. i-тый столбец, идентифицируемый списком ссылающихся столбцов соответствует i-тому столбцу, идентифицированному в разделе referencedtableandcolumns. Типы данных соответствующих столбцов должны совпадать.
  • Если в определении ссылочного ограничения не специфицировано правило модификации (updaterule), то по умолчанию предполагается наличие такого правила с действием NOACTION.
  • Если в определении ссылочного ограничения не специфицировано правило удаления (deleterule), то по умолчанию предполагается наличие такого правила с действием NOАCTION.
  • Пусть Rf обозначает ссылающиеся столбцы, а Rt - соответствующие столбцы в таблице, на которую указывает ссылка. Ссылающаяся таблица и таблица, на которую указывает ссылка, удовлетворяют ссылочному ограничению в том и только в том случае, когда:


      (a) тип соответствия (matchtype) не указан, и для каждой строки ссылающейся таблицы истинно условие RfMATCH (SELECTRtFROMT);

      (b) указан тип соответствия PARTIAL, и для каждой строки ссылающейся таблицы истинно условие RfMATCHPARTIAL (SELECTRtFROMT);

      (c) указан тип соответствия FULL, и для каждой строки ссылающейся таблицы истинно условие RfMATCHFULL (SELECTRtFROMT).



  • Если не указан тип соответствия или если указан тип соответствия FULL, то для данной строки таблицы, на которую указывает ссылка, соответствующими являются все строки ссылающейся таблицы, значения полей ссылающихся столбцов которых равны значениям соответствующих столбцов строки, на которую указывает ссылка.
  • Если указан тип соответствия PARTIAL, то




      для данной строки таблицы, на которую указывает ссылка, соответствующими являются все строки ссылающейся таблицы, содержащие по крайней мере одно не неопределенное значение ссылающегося столбца, причем все не неопределенные значения столбцов этих строк совпадают со значениями соответствующих столбцов строки, на которую указывает ссылка;

      для данной строки таблицы, на которую указывает ссылка, уникально соответствующими являются все соответствующие только ей строки; другие соответствующие строки называются неуникально соответствующими.



  • Для каждой строки таблицы, на которую указывает ссылка, соответствующие, уникально и неуникально соответствующие ей строки определяются непосредственно до выполнения любого оператора SQL. Во время выполнения оператора новые соответствующие строки не добавляются. Связь между неуникально соответствующими строками уничтожается в ходе выполнения оператора SQL, если строка, на которую ведет ссылка помечается для удаления или для изменения значения любого столбца, соответствующего не неопределенному ссылающемуся столбцу. Это происходит сразу после такой пометки. Сразу после этого происходит обнаружение новых уникально или неуникально соответствующих строк.
  • Если специфицировано правило удаления, и строка таблицы, на которую указывает ссылка, помечается для удаления, то


      (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, то во всех уникально соответствующих строках, содержащих не неопределенное значение в ссылающемся столбце, который соответствует изменяемому столбцу, проставляется значение по умолчанию;



  • Все строки, помеченные для удаления, реально удаляются в конце выполнения оператора SQL до проверки каких-либо ограничений целостности.




  • Проверочное ограничение целостности определяется следующим синтаксическим правилом:

    <check constraint definition> ::= CHECK <left paren> <search condition> <right paren>

    Пояснения:

  • Условие поиска не должно содержать спецификации цели и спецификации динамического параметра, а также спецификации агрегатной функции, не содержащейся в подзапросе.
  • Если определение проверочного ограничения содержится в операторе определения временной таблицы со спецификацией ONCOMMITPRESERVEROWS или в операторе определения временной таблицы со спецификацией ONCOMMITPRESERVEROWS, то никакой подзапрос в условии поиска не должен ссылаться на временную таблицу, определенную или объявленную со спецификацией ONCOMMITDELETEROWS.


  • Утверждения целостности определяются следующими синтаксическими правилами:

    <assertion definition> ::= CREATE ASSERTION <constraint name> <assertion check> [ <constraint attributes> ] <assertion check> ::= CHECK <left paren> <search condition> <right paren>

    Пояснения:

  • Если в определении утверждения целостности не специфицированы атрибуты ограничения, то по умолчанию принимаются атрибуты INITIALLYIMMEDIATENOTDEFERRABLE.
  • Условие поиска не должно содержать спецификацию цели или спецификацию динамического параметра.
  • Никакое выражение запроса в условии поиска не должно содержать ссылку на временную таблицу.
  • Утверждение целостности не удовлетворяется в том и только в том случае, когда результат вычисления условия поиска есть false.



  • Содержание раздела