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

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

В этом разделе содержатся следующие подразделы.

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

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

Связанные задачи

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

Ограничения представляют собой правила, которые принудительно применяются в Компонент SQL Server Database Engine от имени пользователя. Например, ограничения UNIQUE можно использовать для обеспечения того, чтобы в указанные столбцы, не входящие в состав первичного ключа, не вводились повторяющиеся значения. Хотя уникальность значений ограничения UNIQUE и PRIMARY KEY гарантируют в равной степени, в случае, когда необходимо обеспечить уникальность в столбце или комбинации столбцов, которые не являются первичными ключевыми, вместо ограничения PRIMARY KEY следует использовать ограничение UNIQUE.

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

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

Компонент Компонент Database Engine автоматически создает индекс UNIQUE, что обеспечивает выполнение требований уникальности значений для ограничений UNIQUE. Поэтому, при попытке вставки в таблицу строки с повторяющимися данными, компонент Компонент Database Engine выдает сообщение об ошибке, в котором сообщается о нарушении ограничения UNIQUE, а строка в таблицу не вставляется. Для обеспечения выполнения ограничения UNIQUE по умолчанию создается уникальный некластеризованный индекс, если явно не указано создание кластеризованного индекса.

Значок стрелки, используемый со ссылкой «В начало»[В начало]

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

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

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

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

ПредупреждениеВнимание!

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

Ограничения проверочных ограничений

Проверочные ограничения отклоняют значения, вычисляемые в FALSE. Поскольку значения NULL вычисляются как UNKNOWN, то их наличие в выражениях может переопределить ограничение. Например, предположим, что на столбец MyColumn типа int установлено следующее ограничение: MyColumn может содержать только значение 10 (MyColumn = 10). При вставке значения NULL в столбец MyColumn компонент Компонент Database Engine вставит значение NULL и не возвратит ошибку.

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

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 завершается успешно.

Проверочные ограничения не проверяются во время выполнения инструкций 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

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

Изменение проверочного ограничения

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

Удаление проверочного ограничения

Описывает, как просматривать свойства проверочного ограничения.

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

Значок стрелки, используемый со ссылкой «В начало»[В начало]