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


ALTER TABLE computed_column_definition (Transact-SQL)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

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

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

Синтаксис

column_name AS computed_column_expression  
[ PERSISTED [ NOT NULL ] ]  
[   
    [ CONSTRAINT constraint_name ]  
    { PRIMARY KEY | UNIQUE }  
        [ CLUSTERED | NONCLUSTERED ]  
        [ WITH FILLFACTOR = fillfactor ]  
        [ WITH ( <index_option> [, ...n ] ) ]  
        [ ON { partition_scheme_name ( partition_column_name ) | filegroup   
            | "default" } ]  
    | [ FOREIGN KEY ]   
        REFERENCES ref_table [ ( ref_column ) ]   
        [ ON DELETE { NO ACTION | CASCADE } ]   
        [ ON UPDATE { NO ACTION } ]   
        [ NOT FOR REPLICATION ]   
    | CHECK [ NOT FOR REPLICATION ] ( logical_expression )  
]  

Аргументы

column_name

Имя столбца, который требуется изменить, добавить или удалить. Имя column_name может иметь длину от 1 до 128 символов. Для новых столбцов, созданных с типом данных timestamp, аргумент column_name можно пропустить. Если для столбца типа timestamp не указан аргумент column_name, используется имя timestamp.

computed_column_expression

Выражение, определяющее значение вычисляемого столбца. Вычисляемый столбец является виртуальным столбцом, который физически не хранится в таблице, а вычисляется с помощью некоторого выражения, использующего другие столбцы данной таблицы. Выражение должно возвращать значение. Например, вычисляемый столбец может иметь определение: стоимость AS price * qty. Другой пример с битовых операторов: is_finalised AS is_checked | is_approved. Выражение может быть именем невычисляемого столбца, константой, функцией, переменной или любой их комбинацией, соединенной одним или несколькими операторами. Выражение не может быть условием поиска и вложенным запросом или включать псевдоним типа данных.

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

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

    Например, если таблица содержит столбцы a и b со значениями целого типа, то вычисляемый столбец a + b может быть индексирован, но вычисляемый столбец a+DATEPART(dd, GETDATE()) не может быть индексирован, так как значение может меняться при каждом следующем вычислении.

  • Вычисляемый столбец не может быть целевым столбцом инструкций INSERT или UPDATE.

    Примечание.

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

PERSISTED

Указывает, что ядро СУБД будет физически хранить вычисляемые значения в таблице и обновлять их при изменении любого столбца, от которого зависит вычисляемый столбец. Пометка вычисляемого столбца признаком PERSISTED позволяет создать индекс на детерминистическом, но не точном вычисляемом столбце. Дополнительные сведения см. в разделе Индексы вычисляемых столбцов. Все вычисляемые столбцы, используемые в столбцах секционирования секционированной таблицы, должны быть явно помечены как PERSISTED. Если указан параметр PERSISTED, значение computed_column_expression должно быть детерминированным.

NULL | NOT NULL

Указывает, допустимы ли для столбца значения NULL. Предложение NULL не является ограничением в строгом смысле слова, но может быть указано так же, как и NOT NULL. Ограничение NOT NULL может быть указано для вычисляемых столбцов только в случае, если одновременно указан параметр PERSISTED.

ОГРАНИЧЕНИЯ

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

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

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

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

UNIQUE

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

CLUSTERED | NONCLUSTERED

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

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

WITH FILLFACTOR =fillfactor

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

Внимание

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

FOREIGN KEY REFERENCES

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

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

(ref_column )
Столбец из таблицы, на которую ссылается ограничение FOREIGN KEY.

ON DELETE { NO ACTION | CASCADE }

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

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

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

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

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

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

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

ON UPDATE { NO ACTION }

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

NOT FOR REPLICATION

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

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

ПРОВЕРКА

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

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

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 для текущего сеанса. Этот параметр принимается по умолчанию. Дополнительные сведения см. в статье SET QUOTED_IDENTIFIER (Transact-SQL).

Замечания

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

Параметр SET QUOTED_IDENTIFIER должен иметь значение ON при создании или изменении индексов по вычисляемым столбцам или индексированным представлениям. Дополнительные сведения см. в статье SET QUOTED_IDENTIFIER (Transact-SQL).

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