ALTER TABLE column_constraint (Transact-SQL)

Применимо к: даSQL Server (все поддерживаемые версии) ДаБаза данных SQL Azure

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

Значок ссылки на раздел Синтаксические обозначения в Transact-SQL

Синтаксис

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

Примечание

Ссылки на описание синтаксиса Transact-SQL для SQL Server 2014 и более ранних версий, см. в статье Документация по предыдущим версиям.

Аргументы

CONSTRAINT
Указывает начало определения для ограничения PRIMARY KEY, UNIQUE, FOREIGN KEY или CHECK.

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

NULL | NOT NULL
Указывает, может ли столбец принимать значения NULL. Столбцы, которые не принимают значения NULL, могут быть добавлены, только если указаны значения по умолчанию. Если в новом столбце допускаются значения NULL и не указано значение по умолчанию, то новый столбец будет содержать NULL в каждой строке таблицы. Если новый столбец принимает значения NULL и вместе с новым столбцом добавлено определение по умолчанию, то с помощью параметра WITH VALUES можно сохранить значения по умолчанию в новом столбце для каждой существующей строки таблицы.

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

Если для добавления столбца необходимы физические изменения в строках данных таблицы, например при добавлении значений DEFAULT в каждую строку, то блокировки в таблице удерживаются в течение всего времени выполнения инструкции ALTER TABLE. Это отражается на возможности изменять содержимое таблицы во время действия блокировки. Однако добавление столбца, допускающего значение NULL, если для нее не указано значение по умолчанию, — это операция, использующая только метаданные и не требующая блокировок.

При использовании инструкций CREATE TABLE или ALTER TABLE параметры базы данных и сеанса влияют и, возможно, отменяют возможность типа данных, который используется в переопределении столбца, содержать значения NULL. Рекомендуется всегда явно определять невычисляемые столбцы как NULL или NOT NULL или, если используется определяемый пользователем тип данных, допустимость столбца принимать значение NULL, по умолчанию, для этого типа данных. Дополнительные сведения см. в разделе CREATE TABLE (Transact-SQL).

PRIMARY KEY
Ограничение, выполняющее принудительную проверку целостности сущностей для указанного столбца или столбцов при использовании уникального индекса. Для каждой таблицы может быть создано только одно ограничение 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 нельзя указать в качестве столбцов для индекса.

WITH FILLFACTOR = fillfactor
Указывает, насколько полно компонент Компонент Database Engine должен заполнять каждую страницу индекса, используемую для хранения индексных данных. Определяемые пользователем значения коэффициента заполнения могут находиться в диапазоне от 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 и выше.

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

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

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

schema_name
Имя схемы, к которой принадлежит таблица со ссылкой от ограничения 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 Database Engine формирует ошибку, и выполняется откат операции удаления строки из родительской таблицы.

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

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

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

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

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

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

Если над строкой в таблице Vendor выполняется инструкция DELETE, а для ProductVendor.VendorID указано действие ON DELETE CASCADE, то компонент Компонент Database Engine проверяет наличие одной или нескольких зависимых строк в таблице ProductVendor. Если они существуют, то, кроме строки в таблице Vendor, будут удалены также и все зависимые строки в таблице ProductVendor.

В противном случае, если задано значение NO ACTION, компонент Компонент Database Engine вызывает ошибку и откатывает действие по удалению строки в таблице Vendor, если хотя бы одна строка в таблице ProductVendor ссылается на нее.

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

NO ACTION
Компонент Компонент Database Engine возвращает ошибку, а обновление строки родительской таблицы откатывается.

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

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

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

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

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

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

Если при выполнении инструкции UPDATE для строки в таблице Vendor указано ON UPDATE CASCADE для столбца ProductVendor.VendorID, компонент Компонент Database Engine проверяет наличие одной или нескольких зависимых строк в таблице ProductVendor. Если они существуют, то, кроме строки в таблице Vendor, будут обновлены также и все зависимые строки в таблице ProductVendor.

Если же указано NO ACTION, компонент Компонент Database Engine инициирует ошибку и откатывает операцию обновления строки таблицы Vendor, если на нее ссылается хотя бы одна строка из таблицы ProductVendor.

NOT FOR REPLICATION
Область применения: SQL Server 2008 и более поздних версий.

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

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

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

Remarks

При добавлении новых ограничений 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 кластеризованный). Ограничения внешнего ключа не вызывают автоматического создания индекса. Однако столбцы внешних ключей часто используются в критериях соединения запросов посредством сопоставления столбца или столбцов из ограничения внешнего ключа одной таблицы со столбцом или столбцами первичного или уникального ключей в другой таблице. Индекс по столбцам таблицы внешнего ключа позволяет компоненту Компонент Database Engine быстро находить связанные данные в таблице внешних ключей.

Примеры

Примеры см. в статье ALTER TABLE (Transact-SQL).

См. также:

ALTER TABLE (Transact-SQL)
column_definition (Transact-SQL)