Поделиться через


Уникальные ограничения и контрольные ограничения

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

Эта тема описана в следующих разделах.

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

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

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

Ограничения уникальные

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

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

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

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

Ограничения проверки

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

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

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

Осторожность

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

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

Ограничения CHECK отклоняют значения, которые оцениваются как FALSE. Поскольку значения NULL оцениваются как UNKNOWN, их присутствие в выражениях может переопределить ограничение. Например, предположим, что ограничение int на столбец MyColumn указывает, что MyColumn может содержать только значение 10 (MyColumn=10). Если вставить значение NULL в MyColumn, ядро СУБД вставляет значение 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 или объектов управления SQL Server (SMO). При внесении изменений в схему с помощью конструктора таблиц или конструктора диаграмм базы данных выполняется попытка удалить и создать таблицу заново. Нельзя удалить опубликованные объекты, поэтому изменение схемы не удастся.

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