Ограничения уникальности и проверочные ограничения

Применимо к:SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

UNIQUE ограничения и CHECK ограничения — это два типа ограничений, которые можно использовать для обеспечения целостности данных в таблицах SQL Server. Это важные объекты базы данных.

Эта статья состоит из следующих разделов:

Ограничения UNIQUE

Ограничения — это правила, применяемые ядро СУБД SQL Server. Например, можно использовать UNIQUE ограничения, чтобы убедиться, что повторяющиеся значения не вводятся в определенных столбцах, которые не участвуют в первичном ключе. UNIQUE Хотя ограничение и PRIMARY KEY ограничение применяют уникальность, используйте UNIQUE ограничение вместо PRIMARY KEY ограничения, если вы хотите применить уникальность столбца (или сочетание столбцов), который не является первичным ключом.

В отличие от PRIMARY KEY ограничений, UNIQUE ограничения позволяют использовать значение NULL. Однако, как и в случае с любым значением, участвующим в UNIQUE ограничении, допускается только одно значение NULL для каждого столбца. Ограничение UNIQUE может ссылаться на FOREIGN KEY ограничение.

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

Ядро СУБД автоматически создает UNIQUE индекс для принудительного UNIQUE применения требования уникальности ограничения. Таким образом, если предпринята попытка вставить повторяющуюся строку, ядро СУБД возвращает сообщение об ошибке, которое указываетUNIQUE, что ограничение было нарушено, и не добавляет строку в таблицу. Если кластеризованный индекс явно не указан, уникальный некластеризованный индекс создается по умолчанию для принудительного UNIQUE применения ограничения.

CHECK, ограничение

CHECK ограничения обеспечивают целостность домена путем ограничения значений, принятых одним или несколькими столбцами. Можно создать CHECK ограничение с любым логическим (логическим) выражением, возвращающим TRUE или FALSE основанным на логических операторах. Например, диапазон значений для salary столбца может быть ограничен путем создания CHECK ограничения, позволяющего использовать только данные, которые варьируются от $15000 до $100 000. Это ограничение исключает возможность устанавливать размер зарплаты, отличный от обычного. Логическое выражение будет иметь следующий вид: salary >= 15000 AND salary <= 100000.

К одному столбцу можно применить несколько CHECK ограничений. Можно также применить одно CHECK ограничение к нескольким столбцам, создав его на уровне таблицы. Например, ограничение с несколькими столбцами CHECK можно использовать для подтверждения того, что любая строка со country_region значением USA столбца также имеет двухзначное значение в столбце state . Это позволяет выполнить проверку сразу нескольких условий из одного выражения.

CHECK ограничения похожи на FOREIGN KEY ограничения, которые управляют значениями, помещающимися в столбец. Разница заключается в том, как они определяют допустимые значения: FOREIGN KEY ограничения получают список допустимых значений из другой таблицы, а CHECK ограничения определяют допустимые значения из логического выражения.

Внимание

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

Ограничения ограничений CHECK

CHECK ограничения отклоняют значения, которые оцениваются FALSE. Поскольку значения NULL оцениваются как UNKNOWN, их присутствие в выражениях может переопределить ограничение. Например, предположим, что вы помещете ограничение в столбец MyColumn int, указывающий, что MyColumn может содержать только значение 10 (MyColumn=10). Если вставить значение NULLMyColumn, ядро СУБД вставляется NULL и не возвращает ошибку.

Ограничение CHECK возвращаетсяTRUE, когда условие проверка не является FALSE ни одной строкой в таблице. Ограничение CHECK работает на уровне строки. Если созданная таблица не имеет строк, CHECK то любое ограничение для этой таблицы считается допустимым. В результате могут возвращаться неожиданные результаты, как в следующем примере.

CREATE TABLE CheckTbl (col1 INT, col2 INT);
GO

CREATE FUNCTION CheckFnctn()
RETURNS INT
AS
BEGIN
    DECLARE @retval INT;
    SELECT @retval = COUNT(*)
    FROM CheckTbl;

    RETURN @retval;
END;
GO

ALTER TABLE CheckTbl ADD CONSTRAINT chkRowCount CHECK (dbo.CheckFnctn() >= 1);
GO

Ограничение CHECK показывает, что в таблице CheckTblдолжна быть хотя бы одна строка. Тем не менее, поскольку в таблице нет строк, для которых проверка условие этого ограничения, ALTER TABLE оператор завершается успешно.

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

INSERT INTO CheckTbl VALUES (10, 10);
GO
DELETE CheckTbl WHERE col1 = 10;

Инструкция DELETE выполняется успешно, даже если ограничение CHECK определяет, что в таблице CheckTbl должна быть хотя бы 1 строка.

Примечание.

Если таблица опубликована для репликации, то изменения схемы следует проводить при помощи инструкции языка Transact-SQL ALTER TABLE или объектов SMO. При изменении схемы с помощью конструктора таблиц или конструктора диаграмм баз данных конструктор пытается удалить и затем вновь создать таблицу. Вы не можете удалить опубликованные объекты, поэтому изменение схемы завершится ошибкой.

Задача Статья
Описывает, как создать ограничение уникальности. Создание уникальных ограничений
Описывает, как изменить ограничение уникальности. Изменение ограничений уникальности
Описывает, как удалить ограничение уникальности. Удаление ограничений уникальности
Описывает создание ограничения проверка. Создание проверочных ограничений
Описывает, как отключить проверочное ограничение при добавлении или обновлении агентом репликации данных в таблице. Отключение проверочных ограничений для репликации
Описывает, как отключить проверочное ограничение при добавлении, обновлении или удалении данных из таблицы. Отключение проверочных ограничений в инструкциях INSERT и UPDATE
Описывает, как изменить выражение ограничения или параметры, которые включают или отключают ограничение применительно к определенным условиям. Изменение проверочных ограничений
Описывает, как удалить проверочное ограничение. Удаление проверочных ограничений
Описывает, как просматривать свойства проверочного ограничения. Ограничения уникальности и проверочные ограничения