ALTER TABLE table_constraint (Transact-SQL)

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

Задает свойства ограничений PRIMARY KEY, UNIQUE, FOREIGN KEY или CHECK, а также определений DEFAULT, добавленных в таблицу с помощью инструкции ALTER TABLE.

Соглашения о синтаксисе Transact-SQL

Синтаксис

[ CONSTRAINT constraint_name ]   
{   
    { PRIMARY KEY | UNIQUE }   
        [ CLUSTERED | NONCLUSTERED ]   
        (column [ ASC | DESC ] [ ,...n ] )  
        [ WITH FILLFACTOR = fillfactor   
        [ WITH ( <index_option>[ , ...n ] ) ]  
        [ ON { partition_scheme_name ( partition_column_name ... )  
          | filegroup | "default" } ]   
    | FOREIGN KEY   
        ( column [ ,...n ] )  
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]   
        [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]   
        [ NOT FOR REPLICATION ]   
    | CONNECTION
        ( { node_table TO node_table } 
          [ , {node_table TO node_table }]
          [ , ...n ]
        )
        [ ON DELETE { NO ACTION | CASCADE } ]
    | DEFAULT constant_expression FOR column [ WITH VALUES ]   
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )  
}  

Примечание.

Сведения о синтаксисе Transact-SQL для SQL Server 2014 (12.x) и более ранних версиях см . в документации по предыдущим версиям.

Аргументы

ОГРАНИЧЕНИЯ
Указывает начало определения ограничений PRIMARY KEY, UNIQUE, FOREIGN KEY и CHECK, а также предложения DEFAULT.

constraint_name
Имя ограничения. Имена ограничений должны подчиняться правилам для идентификаторов, за исключением тех, которые не могут начинаться с символа решетки (#). Если аргумент constraint_name не указан, то ограничению присваивается имя, формируемое системой.

ПЕРВИЧНЫЙ КЛЮЧ
Ограничение, выполняющее принудительную проверку целостности сущностей для указанного столбца или столбцов при использовании уникального индекса. Для каждой таблицы может быть создано только одно ограничение PRIMARY KEY.

UNIQUE
Ограничение, обеспечивающее целостность сущностей для указанного столбца или столбцов при использовании уникального индекса.

CLUSTERED | NONCLUSTERED
Указывает, что для ограничения PRIMARY KEY или UNIQUE создается кластеризованный или некластеризованный индекс. По умолчанию ограничения PRIMARY KEY имеют значение CLUSTERED. По умолчанию ограничения UNIQUE имеют значение NONCLUSTERED.

Если кластеризованное ограничение или индекс уже созданы в таблице, значение CLUSTERED не может быть задано. Если кластеризованное ограничение или индекс уже существует в таблице, ограничения PRIMARY KEY по умолчанию имеют значение NONCLUSTERED.

Столбцы с типами данных ntext, text, varchar(max), nvarchar(max), varbinary(max), xml или image нельзя указать в качестве столбцов для индекса.

column
Столбец или список столбцов в скобках, используемые в новом ограничении.

[ ASC | DESC ]
Указывает порядок сортировки столбца или столбцов, участвующих в ограничениях таблицы. Значение по умолчанию — ASC.

WITH FILLFACTOR =fillfactor
Указывает, как полный ядро СУБД должен сделать каждую страницу индекса, используемую для хранения данных индекса. Пользовательские значения аргумента fillfactor могут быть в диапазоне от 1 до 100. Если значение не задано, по умолчанию принимается значение 0.

Важно!

Описание выражения WITH FILLFACTOR = fillfactor как единственного параметра индекса, применимого к ограничениям PRIMARY KEY или UNIQUE, сохранено для обеспечения обратной совместимости, но в будущих выпусках это выражение документировано не будет. Другие параметры индекса можно указать в предложении index_option инструкции ALTER TABLE.

ON { partition_scheme_name(partition_column_name) | filegroup| "default" }
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

Указывает место хранения индекса, созданного для ограничения. Если определен аргумент partition_scheme_name, индекс разделяется на секции, которые сопоставляются с файловыми группами, определенными аргументом partition_scheme_name. Если указан аргумент filegroup, индекс создается в файловой группе с таким именем. Если указан аргумент "default" или предложение ON не определено вообще, индекс создается в той же файловой группе, что и таблица. Если при добавлении кластеризованного индекса для ограничений PRIMARY KEY или UNIQUE указано предложение ON, то вся таблица перемещается в указанную файловую группу в момент создания этого индекса.

В данном контексте слово "default" не является ключевым словом; это идентификатор файловой группы по умолчанию, который должен быть ограничен специальными символами, как в выражениях ON "default" или ON [default]. Если указано значение "default", то параметру QUOTED_IDENTIFIER для текущего сеанса должно быть присвоено значение ON. Этот параметр принимается по умолчанию.

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

referenced_table_name
Таблица, на которую ссылается ограничение FOREIGN KEY.

ref_column
Столбец или список столбцов в скобках, на которые ссылается новое ограничение FOREIGN KEY.

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
Указывает, какое действие производится над строками изменяемой таблицы, если эти строки имеют ссылочную связь, и строка, на которую имеется ссылка, удаляется из родительской таблицы. Параметр по умолчанию — NO ACTION.

NO ACTION
Sql Server ядро СУБД вызывает ошибку, а действие удаления строки в родительской таблице откатывается.

CASCADE
Если из родительской таблицы удаляется строка, соответствующие ей строки удаляются и из ссылающейся таблицы.

SET NULL
Все значения, составляющие внешний ключ, при удалении соответствующей строки родительской таблицы устанавливаются в значение NULL. Для выполнения этого ограничения внешние ключевые столбцы должны допускать значения NULL.

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

Не следует использовать параметр CASCADE, если таблица будет включена в публикацию слиянием, в которой используются логические записи. Дополнительные сведения о логических записях см. в статье Группирование изменений в связанных строках с помощью логических записей.

Действие ON DELETE CASCADE не может быть определено, если в изменяемой таблице уже существует триггер INSTEAD OF ON DELETE.

Например, в базе данных AdventureWorks2022 таблица ProductVendor имеет ссылочную связь с таблицей Vendor. Внешний ключ ProductVendor.VendorID ссылается на первичный ключ Vendor.VendorID.

Если инструкция DELETE выполняется в строке в таблице "Поставщик" и для ProductVendor.VendorID указывается действие ON DELETE CASCADE, ядро СУБД проверка для одной или нескольких зависимых строк в таблице ProductVendor. Если они существуют, то, кроме строки в таблице Vendor, будут удалены также и все зависимые строки в таблице ProductVendor.

И наоборот, если параметр NO ACTION указан, ядро СУБД вызывает ошибку и откатывает действие удаления в строке поставщика, если в таблице ProductVendor есть по крайней мере одна строка, которая ссылается на нее.

ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
Указывает, какое действие совершается над строками в изменяемой таблице, когда эти строки имеют ссылочную связь и строка родительской таблицы, на которую указывает ссылка, обновляется. Параметр по умолчанию — NO ACTION.

NO ACTION
Ядро СУБД вызывает ошибку, а действие обновления строки в родительской таблице откатится.

CASCADE
Соответствующие строки обновляются в ссылающейся таблице, если эта строка обновляется в родительской таблице.

SET NULL
Всем значениям, составляющим внешний ключ, присваивается значение NULL, когда обновляется соответствующая строка в родительской таблице. Для выполнения этого ограничения внешние ключевые столбцы должны допускать значения NULL.

SET DEFAULT
Всем значениям, составляющим внешний ключ, присваивается их значение по умолчанию, когда обновляется соответствующая строка в родительской таблице. Для выполнения этого ограничения все внешние ключевые столбцы должны иметь определения по умолчанию. Если столбец допускает значения NULL и значение по умолчанию явно не определено, значением столбца по умолчанию становится NULL.

Не следует использовать параметр CASCADE, если таблица будет включена в публикацию слиянием, в которой используются логические записи. Дополнительные сведения о логических записях см. в статье Группирование изменений в связанных строках с помощью логических записей.

Действия ON UPDATE CASCADE, SET NULL и SET DEFAULT не могут быть определены, если в изменяемой таблице уже существует триггер INSTEAD OF для условия ON UPDATE.

Например, в базе данных AdventureWorks2022 таблица ProductVendor имеет ссылочную связь с таблицей Vendor. Внешний ключ ProductVendor.VendorID ссылается на первичный ключ Vendor.VendorID.

Если инструкция UPDATE выполняется в строке в таблице "Поставщик", а для ProductVendor.VendorID указано действие ON UPDATE CASCADE, ядро СУБД проверка для одной или нескольких зависимых строк в таблице ProductVendor. Если они существуют, то, кроме строки, в таблице Vendor будет изменена также и зависимая строка в таблице ProductVendor.

И наоборот, если параметр NO ACTION указан, ядро СУБД вызывает ошибку и откатывает действие обновления в строке поставщика, если в таблице ProductVendor есть по крайней мере одна строка, которая ссылается на нее.

NOT FOR REPLICATION
Применимо: SQL Server 2008 (10.0.x) и более поздних версий.

Может быть определено для ограничений FOREIGN KEY и CHECK. Если ограничение сопровождается этим предложением, оно не выполняется, когда агенты репликации выполняют операции вставки, обновления или удаления.

CONNECTION Указывает пару таблиц узлов, соединение которых разрешает определенное ограничение ребер. При DELETE указывает, что происходит со строками в пограничной таблице, если удаляются узлы, которые были соединены через эту границу в этой пограничной таблице.

ПО УМОЛЧАНИЮ
Задает значение по умолчанию для столбца. Определения DEFAULT могут использоваться для указания значений по умолчанию для новых столбцов в существующих строках данных. Определения DEFAULT нельзя добавлять к столбцам, которые содержат данные типа timestamp, обладают свойством IDENTITY, существующим определением DEFAULT, или в том случае, если для них задано значение по умолчанию. Если для столбца задано значение по умолчанию, необходимо удалить его перед заданием нового умолчания. Если значение по умолчанию указывается для столбца определяемого пользователем типа, этот тип должен поддерживать неявное преобразование выражения constant_expression в определяемый пользователем тип. Для обеспечения совместимости с более ранними версиями SQL Server можно назначить имя ограничения default.

constant_expression
Символьное значение, NULL или системная функция, используемая в качестве значения столбца по умолчанию. Если constant_expression используется в сочетании с столбцом, определенным для определяемого пользователем типа Microsoft платформа .NET Framework, реализация типа должна поддерживать неявное преобразование из constant_expression в определяемый пользователем тип.

FOR column
Определяет столбец, связанный с определением DEFAULT уровня таблицы.

WITH VALUES
При добавлении столбца AND ограничение DEFAULT, если столбец допускает значения NULL с использованием WITH VALUES, задает для существующих строк значение нового столбца в качестве значения, указанного в DEFAULT constant_expression. Если добавляемый столбец не допускает значения NULL, для существующих строк значение столбца всегда будет присваиваться в качестве значения, предоставляемого в DEFAULT constant expression. Начиная с SQL Server 2012, может использоваться операция с метаданными adding-not-null-columns-as-an-online-operation. При использовании в ситуации, когда связанный столбец не добавляется, никакого эффекта не будет.

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

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

Замечания

При добавлении новых ограничений FOREIGN KEY или CHECK все существующие данные проверяются на соответствие ограничениям, если не указан параметр WITH NOCHECK. В том случае, если обнаруживаются нарушения, выполнение ALTER TABLE завершается с ошибкой. При добавлении к существующему столбцу ограничений PRIMARY KEY или UNIQUE все данные в столбце должны быть уникальны. Если будут обнаружены повторяющиеся значения, ALTER TABLE завершится неудачно. При добавлении ограничения PRIMARY KEY или UNIQUE наличие параметра WITH NOCHECK не имеет значения.

Каждое ограничение PRIMARY KEY и UNIQUE создает индекс. Число ограничений UNIQUE и PRIMARY KEY не может вызвать превышение предельного количества индексов в таблице (999 некластеризованных и 1 кластеризованный). Ограничения внешнего ключа не вызывают автоматического создания индекса. Однако столбцы внешних ключей часто используются в критериях соединения запросов посредством сопоставления столбца или столбцов из ограничения внешнего ключа одной таблицы со столбцом или столбцами первичного или уникального ключей в другой таблице. Индекс столбцов внешнего ключа позволяет ядро СУБД быстро находить связанные данные в таблице внешнего ключа.

SQL Server 2022 (16.x) представляет операции возобновления для добавления ограничений таблицы для первичного ключа и уникальных ограничений ключей. Дополнительные сведения об активации и использовании возобновляемых операций ALTER TABLE ADD CONSTRAINT: Возобновляемое добавление табличных ограничений.

Примеры

Примеры см. в разделе ALTER TABLE (Transact-SQL).

Следующие шаги