Ограничения

Ограничения позволяют задать метод, с помощью которого компонент Database Engine автоматически обеспечивает целостность базы данных. Ограничения задают правила допустимости определенных значений в столбцах и представляют собой стандартный механизм обеспечения целостности. Предпочтительнее использовать ограничения, а не Триггеры DML, правила и значения по умолчанию. Оптимизатор запросов также использует определения ограничений для построения высокопроизводительных планов выполнения запросов.

Классы ограничений

SQL Server поддерживает следующие классы ограничений:

  • Ограничение NOT NULL указывает, что в столбце недопустимы значения NULL. Дополнительные сведения см. в разделе Разрешение значений NULL.

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

    Ограничение CHECK задает логическое условие поиска (принимающие значение TRUE, FALSE или unknown), которое применяется ко всем значениям, вставляемым в столбец. Все значения, для которых получается значение FALSE, отбрасываются. Для каждого столбца можно указать несколько ограничений CHECK. В следующем примере показано создание ограничения chk_id. Это ограничение, среди прочего, следит за соблюдением домена первичного ключа, обеспечивая, чтобы в качестве значений ключа вводились только числа указанного диапазона.

    CREATE TABLE cust_sample
       (
       cust_id            int      PRIMARY KEY,
       cust_name         char(50),
       cust_address         char(50),
       cust_credit_limit   money,
       CONSTRAINT chk_id CHECK (cust_id BETWEEN 0 and 10000 )
       )
    
  • Ограничения UNIQUE обеспечивают уникальность значений в наборе столбцов.

    Ограничение UNIQUE не допускает использования одного и того же значения в двух строках столбца. Первичные ключи также обеспечивают уникальность, однако не допускают использование значения NULL в качестве одного из уникальных значений. Дополнительные сведения см. в разделе Ограничения UNIQUE.

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

    Две строки таблицы не могут иметь одинаковых значений первичного ключа. В столбцах первичного ключа недопустимо значение NULL. В качестве первичного ключа рекомендуется использовать небольшой столбец с целочисленными значениями. Каждая таблица должна иметь первичный ключ. Столбец или сочетание столбцов, которые соответствуют требованиям значений первичного ключа, называются потенциальными ключами.

    В следующем примере создается таблица part_sample с указанием поля part_nmbr в качестве первичного ключа.

    CREATE TABLE part_sample
             (part_nmbr      int         PRIMARY KEY,
             part_name      char(30),
             part_weight      decimal(6,2),
             part_color      char(15) );
    
  • Ограничения FOREIGN KEY задают и обеспечивают связи между таблицами. Дополнительные сведения см. в разделе Ограничения FOREIGN KEY.

    Внешний ключ одной таблицы указывает на потенциальный ключ в другой таблице. В следующем примере в таблице order_part создается внешний ключ, который ссылается на таблицу part_sample, определенную ранее.

    CREATE TABLE order_part
          (order_nmbr      int,
          part_nmbr      int
             FOREIGN KEY REFERENCES part_sample(part_nmbr)
                ON DELETE NO ACTION,
          qty_ordered      int);
    GO
    

    Вставить строку со значением внешнего ключа, для которого отсутствует потенциальный ключ с таким значением, нельзя, за исключением строки со значением NULL. Предложение ON DELETE определяет действия, предпринимаемые при попытке удаления строки, на которую указывает существующий внешний ключ. В предложении ON DELETE предусмотрены следующие параметры:

    • NO ACTION: удаления не произойдет и будет выведено сообщение об ошибке.

    • CASCADE: все строки с внешними ключами, указывающими на удаленную строку, также будут удалены.

    • SET NULL: всем строкам с внешними ключами, указывающими на удаленную строку, присваивается значение NULL.

    • SET DEFAULT: всем строкам с внешними ключами, указывающим на удаленную строку, присваивается установленное для них значение по умолчанию. Дополнительные сведения см. в разделе Умолчания.

    Предложение ON UPDATE определяет действия, предпринимаемые при попытке обновления значения потенциального ключа, на которое указывает существующий внешний ключ. Это предложение также поддерживает параметры NO ACTION, CASCADE, SET NULL и SET DEFAULT.

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

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

Например, если таблица имеет два или более столбцов в первичном ключе, для включения в ограничение всех столбцов первичного ключа необходимо использовать ограничение таблицы. Представьте таблицу, в которую записываются все события, происходящие в заводском компьютере. Предположим, что события нескольких типов могут происходить одновременно, однако в одно и то же время не может произойти двух событий одного типа. Этого можно достичь, если включить в первичный ключ таблицы, состоящий из двух столбцов, и столбец event_type, и столбец event_time, как показано в следующем примере.

CREATE TABLE factory_process
   (event_type   int,
   event_time   datetime,
   event_site   char(50),
   event_desc   char(1024),
CONSTRAINT event_key PRIMARY KEY (event_type, event_time) )