Ограничения уникальности и проверочные ограничения
Область применения: 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
). Если вставить значение 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 или объектов SMO. При изменении схемы с помощью конструктора таблиц или конструктора диаграмм баз данных конструктор пытается удалить и затем вновь создать таблицу. Вы не можете удалить опубликованные объекты, поэтому изменение схемы завершится ошибкой.
Связанные задачи
Задача | Статья |
---|---|
Описывает, как создать ограничение уникальности. | Создание уникальных ограничений |
Описывает, как изменить ограничение уникальности. | Изменение ограничений уникальности |
Описывает, как удалить ограничение уникальности. | Удаление ограничений уникальности |
Описывает создание ограничения проверки. | Создание проверочных ограничений |
Описывает, как отключить проверочное ограничение при добавлении или обновлении агентом репликации данных в таблице. | Отключение проверочных ограничений для репликации |
Описывает, как отключить проверочное ограничение при добавлении, обновлении или удалении данных из таблицы. | Отключение проверочных ограничений в инструкциях INSERT и UPDATE |
Описывает, как изменить выражение ограничения или параметры, которые включают или отключают ограничение применительно к определенным условиям. | Изменение проверочных ограничений |
Описывает, как удалить проверочное ограничение. | Удаление проверочных ограничений |
Описывает, как просматривать свойства проверочного ограничения. | Ограничения уникальности и проверочные ограничения |