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


ALTER TABLE table_constraint (Transact-SQL)

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

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

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

Syntax

[ 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 )  
}  

Arguments

CONSTRAINT

Задает начало определения для PRIMARY KEYограничения UNIQUEFOREIGN KEYили CHECK ограниченияDEFAULT.

имя_ограничения

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

ПЕРВИЧНЫЙ КЛЮЧ

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

UNIQUE

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

CLUSTERED | НЕКЛАСТЕРИЗОВАННЫЙ

Указывает, что кластеризованный или некластеризованный индекс создается для 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).

При FILLFACTOR = коэффициент заполнения

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

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

ON { partition_scheme_name(partition_column_name) | файловая группа | "default" }

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

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

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

ССЫЛКИ НА ВНЕШНИЙ КЛЮЧ

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

referenced_table_name

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

ref_column

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

ON DELETE { NO ACTION | КАСКАД | SET NULL | SET DEFAULT }

Указывает, какое действие происходит с строками в таблице, которую вы изменяете, если эти строки имеют связь со ссылкой и удаляете указанную строку из родительской таблицы. Значение по умолчанию — NO ACTION.

БЕЗ ДЕЙСТВИЙ

SQL Server Database Engine вызывает ошибку и откатывает действие удаления строки в родительской таблице.

CASCADE

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

SET NULL

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

НАСТРОЙКА ПО УМОЛЧАНИЮ

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

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

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

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

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

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

ON UPDATE { NO ACTION | КАСКАД | SET NULL | SET DEFAULT }

Указывает, какое действие происходит с строками в таблице, изменяемой при наличии ссылочных связей, и обновляется указанная строка в родительской таблице. Значение по умолчанию — NO ACTION.

БЕЗ ДЕЙСТВИЙ

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

CASCADE

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

SET NULL

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

НАСТРОЙКА ПО УМОЛЧАНИЮ

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

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

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

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

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

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

НЕ ДЛЯ РЕПЛИКАЦИИ

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

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

CONNECTION

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

DEFAULT

Задает значение по умолчанию для столбца. Используйте DEFAULT определения для предоставления значений для нового столбца в существующих строках данных. Нельзя добавлять DEFAULT определения в столбцы с типом данных метки времени , свойством, IDENTITY существующим DEFAULT определением или привязанным значением по умолчанию. Если столбец имеет существующий по умолчанию, перед добавлением нового значения по умолчанию необходимо удалить значение по умолчанию. Если указать значение по умолчанию для столбца определяемого пользователем типа, тип должен поддерживать неявное преобразование из constant_expression в определяемый пользователем тип. Чтобы обеспечить совместимость с более ранними версиями SQL Server, можно назначить имя ограничения DEFAULT.

constant_expression

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

СТОЛБец FOR

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

С ЗНАЧЕНИЯМИ

  • При добавлении столбца и DEFAULT ограничения, если столбец допускает значение NULL, при помощи WITH VALUES установки значения нового столбца для существующих строк значение, заданное в DEFAULTconstant_expression.

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

В SQL Server 2012 и более поздних версиях эта операция может быть операцией метаданных adding-not-null-columns-as-an-online-operation.

Если вы используете WITH VALUES , когда связанный столбец не добавляется, он не действует.

CHECK

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

logical_expression

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

Remarks

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

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

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

Хранилище в Microsoft Fabric поддерживает ограничения столбцов ADD или DROPPRIMARY KEY, UNIQUE и FOREIGN_KEY столбцов, но только если указать параметр NOT ENFORCED. Хранилище в Microsoft Fabric блокирует все остальные операции ALTER TABLE.

Examples

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