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


column_constraint (Transact-SQL)

Изменения: 12 декабря 2006 г.

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

Аргументы

  • CONSTRAINT
    Указывает начало определения для ограничения PRIMARY KEY, UNIQUE, FOREIGN KEY или CHECK.
  • constraint_name
    Имя ограничения. Имена ограничений должны подчиняться общим правилам для идентификаторов, за исключением того, что они не могут начинаться со знака «решетка» (#). Если аргумент constraint_name не указан, то ограничению присваивается имя, формируемое системой.
  • NULL | NOT NULL
    Указывает, может ли столбец принимать значения NULL. Столбцы, которые не принимают значения NULL, могут быть добавлены, только если указаны значения по умолчанию. Если в новом столбце допускаются значения NULL и не указано значение по умолчанию, то новый столбец будет содержать NULL в каждой строке таблицы. Если новый столбец принимает значения NULL и вместе с новым столбцом добавлено определение по умолчанию, то с помощью параметра WITH VALUES можно сохранить значения по умолчанию в новом столбце для каждой существующей строки таблицы.

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

    ms186712.Caution(ru-ru,SQL.90).gifВнимание!
    Если для добавления столбца необходимы физические изменения в строках данных таблицы, например при добавлении значений 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
    Указывает, насколько плотно компонент Microsoft SQL Server 2005 Database Engine должен заполнять каждую страницу индекса, используемую для хранения индексных данных. Пользовательские значения аргумента fillfactor могут лежать в диапазоне от 1 до 100. Если значение не задано, по умолчанию принимается значение 0.

    ms186712.note(ru-ru,SQL.90).gifВажно!
    Описание выражения WITH FILLFACTOR = fillfactor как единственного параметра индекса, применимого к ограничениям PRIMARY KEY или UNIQUE, сохраняется для обеспечения обратной совместимости, но в будущих версиях такого описания не будет. В SQL Server 2005 в предложении index_option инструкции ALTER TABLE можно указать другие параметры индекса.
  • ON { partition_scheme_name**(partition_column_name)** | filegroup | "default" }
    Задает место хранения индекса, созданного для ограничения. Если аргумент partition_scheme_name определен, то индекс делится на секции, а секции сопоставляются с файловыми группами, определенными аргументом partition_scheme_name. Если аргумент filegroup определен, индекс создается в именованной файловой группе. Если определен аргумент "default" или значение ON не определено вообще, индекс создается в той же файловой группе, что и таблица. Если аргумент ON указывается, когда добавляется кластеризованный индекс для ограничения PRIMARY KEY или UNIQUE, таблица во время создания кластеризованного индекса целиком перемещается в указанную файловую группу.

    В данном контексте «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.

    Например, в базе данных 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.

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

Замечания

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

Примеры

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

См. также

Справочник

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

Другие ресурсы

Управление ограничениями, идентификаторами и триггерами с помощью параметра «NOT FOR REPLICATION»

Справка и поддержка

Получение помощи по SQL Server 2005

Журнал изменений

Версия Журнал

12 декабря 2006 г.

Измененное содержимое
  • Разъяснено положение предложений WITH FILLFACTOR и WITH index_option в диаграмме синтаксиса.

14 апреля 2006 г.

Новое содержимое
  • Документировано ограничение на использование параметра CASCADE с логическими записями для репликации слиянием.

5 декабря 2005 г.

Новое содержимое
  • В диаграмме синтаксиса к предложению CHECK добавлено выражение (logical_expression ).
Измененное содержимое
  • Из диаграммы синтаксиса удалено предложение DEFAULT, так как оно уже указано в аргументе column_definition.