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


table_constraint (Transact-SQL)

Задает свойства ограничений 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 ] 
    | DEFAULT constant_expression FOR column [ WITH VALUES ] 
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )
}

Аргументы

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

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

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

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

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

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

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

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

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

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

    Важное примечаниеВажно!

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

  • ON { partition_scheme_name**(partition_column_name)** | filegroup| "default" }
    Задает место хранения индекса, созданного для ограничения. Если определен аргумент 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 требуют, чтобы любое значение в столбце обязательно существовало в указанном столбце ссылочной таблицы.

  • 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.

    Например, в базе данных AdventureWorks таблица 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 не может быть определено, если в изменяемой таблице уже существует триггер INSTEAD OF ON UPDATE.

    Например, в базе данных AdventureWorks таблица 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
    Может быть определено для ограничений FOREIGN KEY и CHECK. Если ограничение сопровождается этим предложением, оно не выполняется, когда агенты репликации выполняют операции вставки, обновления или удаления. Дополнительные сведения см. в разделе Управление ограничениями, идентификаторами и триггерами с помощью параметра «NOT FOR REPLICATION».

  • DEFAULT
    Задает значение по умолчанию для столбца. Определения 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
    Указывает, что значение, заданное в качестве DEFAULT для аргумента constant_expression, сохраняется в новом столбце, добавляемом к существующим строкам. Оператор WITH VALUES может быть указан только в том случае, если указан параметр DEFAULT в предложении ADD столбца. Если добавленный столбец допускает значения NULL и указан оператор WITH VALUES, новый столбец, добавленный к существующим строкам, заполняется значением по умолчанию. Если оператор WITH VALUES не указан для столбцов, допускающих значение NULL, новый столбец для существующих строк заполняется значением NULL. Если новый столбец не допускает значения NULL, значение по умолчанию сохраняется во всех строках независимо от того, указан оператор WITH VALUES или нет.

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

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

Замечания

При добавлении новых ограничений все существующие данные проверяются на соответствие ограничениям. В том случае, если обнаруживаются нарушения, выполнение ALTER TABLE завершается с ошибкой.

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

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

Примеры

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