ВВЕДЕНИЕ В СИСТЕМЫ УПРАВЛЕНИЯ БАЗАМИ ДАННЫХ

       

Синтаксис операторов SQL, использующих ограничения


Стандарт SQL описывает следующие операторы, в которых может быть использованы ограничения:

  • CREATE DOMAIN - создать домен
  • ALTER DOMAIN - изменить домен
  • DROP DOMAIN - удалить домен
  • CREATE TABLE - создать таблицу
  • ALTER TABLE - изменить таблицу
  • DROP TABLE - удалить таблицу
  • CREATE ASSERTION - создать утверждение
  • DROP ASSERTION - удалить утверждение
  • COMMIT WORK - зафиксировать транзакцию
  • SET CONSTRAINTS - установить момент проверки ограничений

    CREATE DOMAIN Имя домена [AS] Тип данных

    [DEFAULT Значение по умолчанию]

    [Имя ограничения] Ограничение check [Атрибуты ограничения]

    Этот оператор задает домен, на основе которого можно определять колонки таблиц. Т.к. имя колонки, которая будет основана на этом домене заранее неизвестно, то в ограничении CHECK домена для ссылки на значение этого домена используется ключевое слово VALUE. В конкретной таблице СУБД заменит слово VALUE на имя колонки таблицы.

    Пример 18. Приведенный ниже оператор создает домен Salary на основе целочисленного типа данных, причем значения из этого домена не могут принимать неположительные значения (но могут принимать значение NULL!). По умолчанию это ограничение проверяется немедленно, но может быть и отложенным: CREATE DOMAIN Salary AS integer CHECK (VALUE > 0) DEFERRABLE INITIALLY IMMEDIATE

    ALTER DOMAIN Имя домена

    {SET DEFAULT Значение по умолчанию}

    | {DROP DEFAULT}

    | {ADD [Имя ограничения] Ограничение check [Атрибуты ограничения]}

    | {DROP CONSTRAINT Имя ограничения}

    Этот оператор изменяет имеющийся домен. Стандарт запрещает вносить несколько изменений одной командой ALTER DOMAIN. Т.е. если требуется удалить ограничение CHECK и добавить значение по умолчанию, то придется выполнить два оператора ALTER DOMAIN.



    DROP DOMAIN Имя домена CASCADE | RESTRICT

    Этот оператор уничтожает имеющийся домен. Если указана опция RESTRICT, то домен не уничтожается, если имеются ссылки на него из столбцов таблиц. Если указана опция CASCADE, то происходят следующие действия:

  • Тип данных домена передается столбцам, основанным на этом домене.
  • Если столбец не имеет значения по умолчанию, а для домена значение по умолчанию определено, то оно становится значением по умолчанию для столбца.
  • Все ограничения домена становятся ограничениями столбца.


    CREATE TABLE Имя таблицы

    ( {Определение столбца | [Ограничение таблицы]}.,..)
    Определение столбца::=

    Имя столбца {Имя домена | Тип данных [Размер]}

    [Ограничение столбца…]

    [DEFAULT Значение по умолчанию]
    Этот оператор (синтаксис приведен не полностью - пропущены опции создания временных таблиц) создает таблицу базы данных. В таблице обязано быть не менее одного определения столбца. В таблице может быть определено несколько ограничений (в том числе и ни одного).
    Каждый столбец должен иметь имя и быть определен на некотором типе данных или на некотором домене. Ограничения домена становятся ограничениями столбца. Кроме того, столбец может иметь дополнительные ограничения. Если домен имеет значение по умолчанию и в определении столбца определено значение по умолчанию, то значение для столбца перекрывает значение для домена.
    Пример 19.
    CREATE TABLE Salespeaple (Salespeaple_Id Id_Nums PRIMARY KEY, Fam CHAR(20) NOT NULL, Im CHAR(15), BirthDate DATE, Salary Salary_Domain DEFAULT 1000, City_Id INTEGER REFERENCES City ON UPDATE CASCADE ON DELETE RESTRICT, District_Id INTEGER, CONSTRAINT AltKey UNIQUE(Fam, Im, BirthDate), CHECK (City_Id IS NOT NULL OR District_Id IS NOT NULL), FOREIN KEY District_Id REFERENCES District ON UPDATE CASCADE ON DELETE RESTRICT)
    Этот оператор создает таблицу Salespeaple с колонками (Salespeaple_Id, Fam, Im, BirthDate, Salary, City_Id, District_Id) и следующими ограничениями:
  • Колонка Salespeaple_Id наследует все ограничения домена Id_Nums. Кроме того, эта колонка образует первичный ключ таблицы (следовательно, не допускает NULL-значений).
  • Колонка Fam не допускает NULL-значений.
  • Колонка Salary наследует все ограничения домена Salary_Domain. Кроме того, эта колонка имеет значения по умолчанию1000.
  • Колонка City_Id является внешним ключом, ссылающимся на первичный ключ таблицы City. При изменении первичного ключа в таблице City соответствующие значения внешнего ключа в таблице Salespeaple будут каскадно изменены. При удалении строки из таблицы City будет выполняться проверка, нет ли ссылок на удаляемую строку из таблицы Salespeaple.


    Если такие ссылки найдутся, то операция удаления в таблице City будет отвергнута.
  • Колонка District_Id также является внешним ключом, ссылающимся на первичный ключ таблицы District. Этот внешний ключ, в отличие от предыдущего, определен как ограничение таблицы. Действия, определенные по ссылке аналогичны предыдущим.
  • Колонки (Fam, Im, BirthDate) образуют альтернативный ключ таблицы. Это ограничение имеет наименование AltKey.
  • Колонки City_Id и District_Id не могут одновременно принимать NULL-значения (хотя каждая из них по отдельности допускает использование NULL-значений).
    ALTER TABLE Имя таблицы

    {ADD [COLUMN] Определение столбца}

    | {ALTER [COLUMN] Имя столбца {SET DEFAULT Значение по умолчанию | DROP DEFAULT}}

    | {DROP [COLUMN] Имя столбца RESTRICT | CASCADE}

    | {ADD Ограничение таблицы}

    | {DROP CONSTRAINT Имя ограничения RESTRICT | CASCADE}
    Этот оператор позволяет изменять имеющуюся таблицу. В таблице можно удалять или добавлять колонки и/или ограничения. Кроме того, для колонок можно менять значение по умолчанию.
    DROP TABLE Имя таблицы CASCADE | RESTRICT
    Этот оператор позволяет удалять имеющуюся таблицу. Вместе с таблицей удаляются и ограничения, определенные для этой таблицы.
    Если указан параметр RESTRICT, то таблица удаляется только если нет никаких ссылок на эту таблицу в других ограничениях или представлениях.
    Если указан параметр CASCADE, то удаляются также и все объекты, ссылающиеся на эту таблицу.
    CREATE ASSERTION Имя утверждения

    Ограничение check

    [Атрибуты ограничения]
    Этот оператор позволяет создавать утверждения - т.е. ограничения, не являющиеся частью определения домена, колонки или таблицы.
    Предикат CHECK, входящий в определение утверждения, может быть достаточно сложным и содержать ссылки на несколько таблиц.
    Пример 20.
    CREATE ASSERTION Check_Pay CHECK (Salespeaple.Salary IS NOT NULL) OR (Salespeaple.Commission IS NOT NULL) DEFERRABLE INITIALLY IMMEDIATE
    DROP ASSERTION Имя утверждения
    Этот оператор позволяет удалять имеющееся утверждение.
    COMMIT WORK
    Этот оператор фиксирует транзакцию. При этом проверяются все отложенные до конца транзакции ограничения. Если одно из ограничений не выполняется, то транзакция откатывается.
    SET CONSTRAINT {Имя ограничения.,.. | ALL}

    {DEFERRED | IMMEDIATE}
    Этот оператор позволяет во время выполнения транзакции менять момент проверки всех (ALL) или некоторых ограничений. Этот оператор действует только на ограничения, определенные как DEFERRABLE (потенциально откладываемые). Если ограничение A находилось в состоянии IMMEDIATE (немедленно проверяемое), то оператор SET CONSTRAINT A DEFERRED переводит его в состояние DEFERRED (с отложенной проверкой) и тогда все операции, потенциально могущие нарушить это ограничение, будут выполняться без проверки. Проверка будет произведена в конце транзакции или в момент подачи команды SET CONSTRAINT A IMMEDIATE.

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