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

ОБЛАСТЬ ПРИМЕНЕНИЯ: даSQL Server даБаза данных SQL Azure нетAzure Synapse Analytics (хранилище данных SQL) нетParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Ограничения UNIQUE и CHECK — это два типа ограничений, которые могут использоваться для обеспечения целостности данных в таблицах SQL ServerSQL Server .UNIQUE constraints and CHECK constraints are two types of constraints that can be used to enforce data integrity in SQL ServerSQL Server tables. Это важные объекты базы данных.These are important database objects.

Эта тема описана в следующих разделах.This topic contains the following sections.

Ограничения UNIQUEUNIQUE Constraints

Ограничения CHECKCHECK Constraints

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

Ограничения UNIQUEUNIQUE Constraints

Ограничения представляют собой правила, которые принудительно применяются в Компонент SQL Server Database EngineSQL Server Database Engine от имени пользователя.Constraints are rules that the Компонент SQL Server Database EngineSQL Server Database Engine enforces for you. Например, ограничения UNIQUE можно использовать для обеспечения того, чтобы в указанные столбцы, не входящие в состав первичного ключа, не вводились повторяющиеся значения.For example, you can use UNIQUE constraints to make sure that no duplicate values are entered in specific columns that do not participate in a primary key. Хотя уникальность значений ограничения UNIQUE и PRIMARY KEY гарантируют в равной степени, в случае, когда необходимо обеспечить уникальность в столбце или комбинации столбцов, которые не являются первичными ключевыми, вместо ограничения PRIMARY KEY следует использовать ограничение UNIQUE.Although both a UNIQUE constraint and a PRIMARY KEY constraint enforce uniqueness, use a UNIQUE constraint instead of a PRIMARY KEY constraint when you want to enforce the uniqueness of a column, or combination of columns, that is not the primary key.

В отличие от PRIMARY KEY, ограничения UNIQUE допускают значение NULL.Unlike PRIMARY KEY constraints, UNIQUE constraints allow for the value NULL. Однако, как и всякое другое значение столбца с ограничением UNIQUE, NULL может встречаться только один раз.However, as with any value participating in a UNIQUE constraint, only one null value is allowed per column. На ограничение UNIQUE могут ссылаться ограничения FOREIGN KEY.A UNIQUE constraint can be referenced by a FOREIGN KEY constraint.

При добавлении ограничения UNIQUE на уже существующий столбец или группу столбцов в таблице, компонент Компонент Database EngineDatabase Engine по умолчанию проверяет уникальность всех существующих значений в указанных столбцах.When a UNIQUE constraint is added to an existing column or columns in the table, by default, the Компонент Database EngineDatabase Engine examines the existing data in the columns to make sure all values are unique. При попытке добавить ограничение UNIQUE к столбцу, содержащему повторяющиеся значения, компонент Компонент Database EngineDatabase Engine возвращает ошибку, а ограничение не добавляется.If a UNIQUE constraint is added to a column that has duplicated values, the Компонент Database EngineDatabase Engine returns an error and does not add the constraint.

Компонент Компонент Database EngineDatabase Engine автоматически создает индекс UNIQUE, что обеспечивает выполнение требований уникальности значений для ограничений UNIQUE.The Компонент Database EngineDatabase Engine automatically creates a UNIQUE index to enforce the uniqueness requirement of the UNIQUE constraint. Поэтому, при попытке вставки в таблицу строки с повторяющимися данными, компонент Компонент Database EngineDatabase Engine выдает сообщение об ошибке, в котором сообщается о нарушении ограничения UNIQUE, а строка в таблицу не вставляется.Therefore, if an attempt to insert a duplicate row is made, the Компонент Database EngineDatabase Engine returns an error message that states the UNIQUE constraint has been violated and does not add the row to the table. Для обеспечения выполнения ограничения UNIQUE по умолчанию создается уникальный некластеризованный индекс, если явно не указано создание кластеризованного индекса.Unless a clustered index is explicitly specified, a unique, nonclustered index is created by default to enforce the UNIQUE constraint.

Ограничения CHECKCHECK Constraints

Проверочные ограничения принудительно сохраняют целостность домена, ограничивая значения, которые может принимать один или более столбцов.CHECK constraints enforce domain integrity by limiting the values that are accepted by one or more columns. Проверочное ограничение можно создать с любым логическим выражением, возвращающим значение TRUE или FALSE на основе логических операторов.You can create a CHECK constraint with any logical (Boolean) expression that returns TRUE or FALSE based on the logical operators. Например, чтобы ограничить интервал значений столбца salary , можно создать ограничение CHECK, позволяющее столбцу принимать значения только в интервале от 15 000 до 100 000 долларов.For example, the range of values for a salary column can be limited by creating a CHECK constraint that allows for only data that ranges from $15,000 through $100,000. Это ограничение исключает возможность устанавливать размер зарплаты, отличный от обычного.This prevents salaries from being entered beyond the regular salary range. Логическое выражение будет иметь следующий вид: salary >= 15000 AND salary <= 100000.The logical expression would be the following: salary >= 15000 AND salary <= 100000.

К одному столбцу можно применять несколько проверочных ограничений.You can apply multiple CHECK constraints to a single column. Кроме того, можно применять одно проверочное ограничение к нескольким столбцам. Для этого ограничение нужно создать на уровне таблицы.You can also apply a single CHECK constraint to multiple columns by creating it at the table level. Например, с помощью проверочного ограничения, распространяющегося на несколько столбцов, можно подтвердить, что в любой строке со значением USA в столбце country_region имеется также двухсимвольное значение в столбце state .For example, a multiple-column CHECK constraint could be used to confirm that any row with a country_region column value of USA also has a two-character value in the state column. Это позволяет выполнить проверку сразу нескольких условий из одного выражения.This allows for multiple conditions to be checked in one location.

Проверочные ограничения подобны ограничениям внешнего ключа, так как они управляют значениями, которые присваиваются столбцу.CHECK constraints are similar to FOREIGN KEY constraints in that they control the values that are put in a column. Однако они по-разному определяют допустимые значения. Ограничения внешнего ключа получают список допустимых значений из другой таблицы, а проверочные ограничения определяют допустимые значения по логическому выражению.The difference is in how they determine which values are valid: FOREIGN KEY constraints obtain the list of valid values from another table, while CHECK constraints determine the valid values from a logical expression.

Внимание!

Ограничения, которые включают явное или неявное преобразование данных, могут вызывать ошибки в операциях такого рода.Constraints that include implicit or explicit data type conversion may cause certain operations to fail. Например, ограничения, заданные для таблиц, которые являются исходными при переключении секций, могут приводить к ошибкам при использовании оператора ALTER TABLE...SWITCH.For example, such constraints defined on tables that are sources of partition switching may cause an ALTER TABLE...SWITCH operation to fail. Следует избегать преобразования типов данных в определениях ограничений.Avoid data type conversion in constraint definitions.

Ограничения проверочных ограниченийLimitations of CHECK Constraints

Проверочные ограничения отклоняют значения, вычисляемые в FALSE.CHECK constraints reject values that evaluate to FALSE. Поскольку значения NULL вычисляются как UNKNOWN, то их наличие в выражениях может переопределить ограничение.Because null values evaluate to UNKNOWN, their presence in expressions may override a constraint. Например, предположим, что на столбец MyColumn типа int установлено следующее ограничение: MyColumn может содержать только значение 10 (MyColumn=10).For example, suppose you place a constraint on an int column MyColumn specifying that MyColumn can contain only the value 10 (MyColumn=10). При вставке значения NULL в столбец MyColumnкомпонент Компонент Database EngineDatabase Engine вставит значение NULL и не возвратит ошибку.If you insert the value NULL into MyColumn, the Компонент Database EngineDatabase Engine inserts NULL and does not return an error.

Проверочное ограничение возвращает TRUE, если для проверяемого условия в любой строке таблицы отсутствует значение FALSE.A CHECK constraint returns TRUE when the condition it is checking is not FALSE for any row in the table. Проверочное ограничение работает на уровне строки.A CHECK constraint works at the row level. Если в только что созданной таблице отсутствуют строки, то любое проверочное ограничение на эту таблицу считается допустимым.If a table that has just been created does not have any rows, any CHECK constraint on this table is considered valid. В результате могут возвращаться неожиданные результаты, как в следующем примере.This situation can produce unexpected results, as in the following example.

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должна быть хотя бы одна строка.The CHECK constraint being added specifies that there must be at least one row in table CheckTbl. Однако поскольку в таблице нет ни одной строки, над которой можно было бы произвести проверку ограничения, инструкция ALTER TABLE завершается успешно.However, because there are no rows in the table against which to check the condition of this constraint, the ALTER TABLE statement succeeds.

Проверочные ограничения не проверяются во время выполнения инструкций DELETE.CHECK constraints are not validated during DELETE statements. Таким образом, выполнение инструкций DELETE над таблицами с некоторыми типами проверочных ограничений может приводить к неожиданным результатам.Therefore, executing DELETE statements on tables with certain types of check constraints may produce unexpected results. Например, предположим, что следующие выражения выполняются над таблицей CheckTbl.For example, consider the following statements executed on table CheckTbl.

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

Инструкция DELETE выполняется успешно, даже если ограничение CHECK определяет, что в таблице CheckTbl должна быть хотя бы 1 строка.The DELETE statement succeeds, even though the CHECK constraint specifies that table CheckTbl must have at least 1 row.

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

Примечание

Если таблица опубликована для репликации, то изменения схемы следует проводить при помощи инструкции языка Transact-SQL ALTER TABLE или объектов SMO.If the table is published for replication, you must make schema changes using the Transact-SQL statement ALTER TABLE or SQL Server Management Objects (SMO). При изменении схемы с помощью конструктора таблиц или конструктора диаграмм баз данных конструктор пытается удалить и затем вновь создать таблицу.When schema changes are made using the Table Designer or the Database Diagram Designer, it attempts to drop and recreate the table. Но поскольку удалять опубликованные объекты нельзя, изменения схемы не будут применены.You cannot drop published objects, therefore the schema change will fail.

ЗадачаTask РазделTopic
Описывает, как создать ограничение уникальности.Describes how to create a unique constraint. Создание ограничений уникальностиCreate Unique Constraints
Описывает, как изменить ограничение уникальности.Describes how to modify a unique constraint. Изменение ограничения уникальностиModify Unique Constraints
Описывает, как удалить ограничение уникальности.Describes how to delete a unique constraint. Удаление ограничений уникальностиDelete Unique Constraints
Описывает, как отключить проверочное ограничение при добавлении или обновлении агентом репликации данных в таблице.Describes how to disable a check constraint when a replication agent inserts or updates data in your table. Отключение проверочных ограничений для репликацииDisable Check Constraints for Replication
Описывает, как отключить проверочное ограничение при добавлении, обновлении или удалении данных из таблицы.Describes how to disable a check constraint when data is added to, updated in, or deleted from a table. Отключение проверочных ограничений в инструкциях INSERT и UPDATEDisable Check Constraints with INSERT and UPDATE Statements
Описывает, как изменить выражение ограничения или параметры, которые включают или отключают ограничение применительно к определенным условиям.Describes how to change the constraint expression or the options that enable or disable the constraint for specific conditions. Изменение проверочного ограниченияModify Check Constraints
Описывает, как удалить проверочное ограничение.Describes how to delete a check constraint. Удаление проверочного ограниченияDelete Check Constraints
Описывает, как просматривать свойства проверочного ограничения.Describes how to view the properties of a check constraint. Ограничения уникальности и проверочные ограниченияUnique Constraints and Check Constraints