ALTER TABLE column_constraint (Transact-SQL)ALTER TABLE column_constraint (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure nãoAzure Synapse Analytics (SQL DW) nãoParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Especifica as propriedades de uma restrição PRIMARY KEY, FOREIGN KEY, UNIQUE ou CHECK que faz parte da definição de uma nova coluna adicionada a uma tabela usando ALTER TABLE.Specifies the properties of a PRIMARY KEY, FOREIGN KEY, UNIQUE, or CHECK constraint that is part of a new column definition added to a table by using ALTER TABLE.

Ícone de link do tópico Convenções de sintaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

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

ArgumentosArguments

CONSTRAINTCONSTRAINT
Especifica o início da definição para uma restrição PRIMARY KEY, UNIQUE, FOREIGN KEY ou CHECK.Specifies the start of the definition for a PRIMARY KEY, UNIQUE, FOREIGN KEY, or CHECK constraint.

constraint_nameconstraint_name
É o nome da restrição.Is the name of the constraint. Os nomes de restrição devem seguir as regras para identificadores, a não ser que o nome não possa começar com uma tecla jogo da velha (#).Constraint names must follow the rules for identifiers, except that the name cannot start with a number sign (#). Se constraint_name não for fornecido, um nome gerado pelo sistema será atribuído à restrição.If constraint_name is not supplied, a system-generated name is assigned to the constraint.

NULL | NOT NULLNULL | NOT NULL
Especifica se a coluna pode aceitar valores nulos.Specifies whether the column can accept null values. Colunas que não aceitam valores nulos podem ser adicionadas somente se tiverem um padrão especificado.Columns that do not allow null values can be added only if they have a default specified. Se a nova coluna permitir valores nulos e nenhum padrão for especificado, ela será NULL para cada linha da tabela.If the new column allows null values and no default is specified, the new column contains NULL for each row in the table. Se a nova coluna permitir valores nulos e uma definição padrão for adicionada com a nova coluna, a opção WITH VALUES poderá ser usada para armazenar o valor padrão na nova coluna para cada linha existente na tabela.If the new column allows null values and a default definition is added with the new column, the WITH VALUES option can be used to store the default value in the new column for each existing row in the table.

Se a nova coluna não permitir valores nulos, uma definição DEFAULT deverá ser adicionada a ela.If the new column does not allow null values, a DEFAULT definition must be added with the new column. A nova coluna é carregada automaticamente com o valor padrão nas novas colunas em cada linha existente.The new column automatically loads with the default value in the new columns in each existing row.

Quando a adição de uma coluna requer alterações físicas às linhas de dados de uma tabela, tal como adicionar valores DEFAULT a cada linha, bloqueios são mantidos na tabela durante a execução de ALTER TABLE.When the addition of a column requires physical changes to the data rows of a table, such as adding DEFAULT values to each row, locks are held on the table while ALTER TABLE runs. Isso afeta a capacidade de alterar o conteúdo da tabela enquanto o bloqueio estiver em vigor.This affects the ability to change the content of the table while the lock is in place. Entretanto, a adição de uma coluna que permite valores nulos e não especifica um valor padrão é uma operação de metadados somente e não envolve nenhum bloqueio.In contrast, adding a column that allows null values and does not specify a default value is a metadata operation only, and involves no locks.

Quando CREATE TABLE ou ALTER TABLE é usado, a configuração de banco de dados e de sessão influencia e, possivelmente, substitui a nulabilidade do tipo de dados que é usado em uma definição de coluna.When you use CREATE TABLE or ALTER TABLE, database and session settings influence and possibly override the nullability of the data type that is used in a column definition. Recomendamos que você sempre defina explicitamente colunas não computadas como NULL ou NOT NULL ou, se usar um tipo de dados definido pelo usuário, que permita que a coluna use a nulabilidade padrão do tipo de dados.We recommend that you always explicitly define noncomputed columns as NULL or NOT NULL or, if you use a user-defined data type, that you allow the column to use the default nullability of the data type. Para obter mais informações, consulte CREATE TABLE (Transact-SQL).For more information, see CREATE TABLE (Transact-SQL).

PRIMARY KEYPRIMARY KEY
É uma restrição que impõe a integridade de entidade para uma coluna ou colunas especificadas usando um índice exclusivo.Is a constraint that enforces entity integrity for a specified column or columns by using a unique index. Somente uma restrição PRIMARY KEY pode ser criada para cada tabela.Only one PRIMARY KEY constraint can be created for each table.

UNIQUEUNIQUE
É uma restrição que fornece a integridade de entidade para uma coluna ou colunas especificadas usando um índice exclusivo.Is a constraint that provides entity integrity for a specified column or columns by using a unique index.

CLUSTERED | NONCLUSTEREDCLUSTERED | NONCLUSTERED
Especifica que um índice clusterizado ou não clusterizado é criado para a restrição PRIMARY KEY ou UNIQUE.Specifies that a clustered or nonclustered index is created for the PRIMARY KEY or UNIQUE constraint. As restrições PRIMARY KEY usam como padrão CLUSTERED.PRIMARY KEY constraints default to CLUSTERED. As restrições UNIQUE usam como padrão NONCLUSTERED.UNIQUE constraints default to NONCLUSTERED.

Se uma restrição ou índice clusterizado já existir em uma tabela, CLUSTERED não poderá ser especificado.If a clustered constraint or index already exists on a table, CLUSTERED cannot be specified. Se uma restrição ou índice clusterizado já existir em uma tabela, as restrições PRIMARY KEY usam como padrão NONCLUSTERED.If a clustered constraint or index already exists on a table, PRIMARY KEY constraints default to NONCLUSTERED.

Colunas que são dos tipos de dados ntext, text, varchar(max) , nvarchar(max) , varbinary(max) , xml ou image não podem ser especificadas como colunas de para índice.Columns that are of the ntext, text, varchar(max), nvarchar(max), varbinary(max), xml, or image data types cannot be specified as columns for an index.

WITH FILLFACTOR = fillfactorWITH FILLFACTOR =fillfactor
Especifica o quanto o Mecanismo de Banco de DadosDatabase Engine deve preencher cada página de índice usada para armazenar os dados de índice.Specifies how full the Mecanismo de Banco de DadosDatabase Engine should make each index page used to store the index data. Os valores de fator de preenchimento especificados pelo usuário podem ser de 1 a 100.User-specified fill factor values can be from 1 through 100. Se um valor não for especificado, o padrão será 0.If a value is not specified, the default is 0.

Importante

A documentação de WITH FILLFACTOR = fillfactor como a única opção de índice aplicável às restrições PRIMARY KEY ou UNIQUE é mantida para fins de compatibilidade com versões anteriores, mas não será documentada dessa maneira em versões futuras.Documenting WITH FILLFACTOR = fillfactor as the only index option that applies to PRIMARY KEY or UNIQUE constraints is maintained for backward compatibility, but will not be documented in this manner in future releases. Outras opções de índice podem ser especificadas na cláusula index_option de ALTER TABLE.Other index options can be specified in the index_option clause of ALTER TABLE.

ON { partition_scheme_name ( partition_column_name ) | filegroup | " default " } Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.ON { partition_scheme_name(partition_column_name) | filegroup | " default " } Applies to: SQL Server 2008SQL Server 2008 and later.

Especifica o local de armazenamento do índice criado para a restrição.Specifies the storage location of the index created for the constraint. Se partition_scheme_name for especificado, o índice será particionado e as partições serão mapeadas para os grupos de arquivos especificados pelo partition_scheme_name.If partition_scheme_name is specified, the index is partitioned and the partitions are mapped to the filegroups that are specified by partition_scheme_name. Se filegroup for especificado, o índice será criado no grupo de arquivos nomeado.If filegroup is specified, the index is created in the named filegroup. Se " default " for especificado ou se ON não for especificado de modo algum, o índice será criado no mesmo grupo de arquivos que a tabela.If " default " is specified or if ON is not specified at all, the index is created in the same filegroup as the table. Se ON for especificado quando um índice clusterizado for adicionado a uma restrição PRIMARY KEY ou UNIQUE, a tabela inteira será movida para o grupo de arquivos especificado quando o índice clusterizado for criado.If ON is specified when a clustered index is added for a PRIMARY KEY or UNIQUE constraint, the whole table is moved to the specified filegroup when the clustered index is created.

Nesse contexto, default não é uma palavra-chave.In this context, default, is not a keyword. É um identificador do grupo de arquivos padrão e precisa ser delimitado, como em ON " default " ou ON [ default ] .It is an identifier for the default filegroup and must be delimited, as in ON " default " or ON [ default ]. Se " default " for especificado, a opção QUOTED_IDENTIFIER deverá ser ON para a sessão atual.If " default " is specified, the QUOTED_IDENTIFIER option must be ON for the current session. Essa é a configuração padrão.This is the default setting. Para obter mais informações, veja SET QUOTED_IDENTIFIER (Transact-SQL).For more information, see SET QUOTED_IDENTIFIER (Transact-SQL).

FOREIGN KEY REFERENCESFOREIGN KEY REFERENCES
É uma restrição que fornece integridade referencial para obter dados na coluna.Is a constraint that provides referential integrity for the data in the column. Restrições FOREIGN KEY requerem que cada valor na coluna exista na coluna especificada na tabela referenciada.FOREIGN KEY constraints require that each value in the column exist in the specified column in the referenced table.

schema_nameschema_name
É o nome do esquema ao qual pertence a tabela referenciada pela restrição FOREIGN KEY.Is the name of the schema to which the table referenced by the FOREIGN KEY constraint belongs.

referenced_table_namereferenced_table_name
É a tabela referenciada pela restrição FOREIGN KEY.Is the table referenced by the FOREIGN KEY constraint.

ref_columnref_column
É uma coluna entre parênteses referenciada pela nova restrição FOREIGN KEY.Is a column in parentheses referenced by the new FOREIGN KEY constraint.

ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
Especifica a ação que acontece nas linhas da tabela alterada, se essas linhas tiverem uma relação referencial e a linha referenciada for excluída da tabela pai.Specifies what action happens to rows in the table that is altered, if those rows have a referential relationship and the referenced row is deleted from the parent table. O padrão é NO ACTION.The default is NO ACTION.

NO ACTIONNO ACTION
O Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine gera um erro e a ação de excluir na linha da tabela pai é revertida.The Mecanismo de Banco de Dados do SQL ServerSQL Server Database Engine raises an error and the delete action on the row in the parent table is rolled back.

CASCADECASCADE
As linhas correspondentes serão excluídas da tabela de referência se aquela linha for excluída da tabela pai.Corresponding rows are deleted from the referencing table if that row is deleted from the parent table.

SET NULLSET NULL
Todos os valores que compõem a chave estrangeira são definidos como NULL quando a linha correspondente na tabela pai é excluída.All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is deleted. Para que essa restrição seja executada, as colunas de chave estrangeira devem ser anuláveis.For this constraint to execute, the foreign key columns must be nullable.

SET DEFAULTSET DEFAULT
Todos os valores que incluem a chave estrangeira são definidos como seus valores padrão quando a linha correspondente na tabela pai é excluída.All the values that comprise the foreign key are set to their default values when the corresponding row in the parent table is deleted. Para que essa restrição seja executada, todas as colunas de chave estrangeira devem ter definições padrão.For this constraint to execute, all foreign key columns must have default definitions. Se a coluna for anulável e não houver nenhum valor padrão explícito definido, NULL se tornará o valor padrão implícito para a coluna.If a column is nullable and there is no explicit default value set, NULL becomes the implicit default value of the column.

Não especifique CASCADE se a tabela for incluída em uma publicação de mesclagem que usa registros lógicos.Do not specify CASCADE if the table will be included in a merge publication that uses logical records. Para obter mais informações sobre registros lógicos, consulte Agrupar alterações em linhas relacionadas com registros lógicos.For more information about logical records, see Group Changes to Related Rows with Logical Records.

ON DELETE CASCADE não poderá ser definido se um disparador INSTEAD OF ON DELETE já existir na tabela que está sendo alterada.The ON DELETE CASCADE cannot be defined if an INSTEAD OF trigger ON DELETE already exists on the table that is being altered.

Por exemplo, no banco de dados do AdventureWorks2012AdventureWorks2012, a tabela ProductVendor tem uma relação referencial com a tabela Vendor.For example, in the AdventureWorks2012AdventureWorks2012 database, the ProductVendor table has a referential relationship with the Vendor table. A chave estrangeira ProductVendor.VendorID faz referência à chave primária Vendor.VendorID.The ProductVendor.VendorID foreign key references the Vendor.VendorID primary key.

Se uma instrução DELETE for executada em uma linha da tabela Vendor e uma ação ON DELETE CASCADE for especificada para ProductVendor.VendorID, o Mecanismo de Banco de DadosDatabase Engine verificará se há uma ou mais linhas dependentes na tabela ProductVendor.If a DELETE statement is executed on a row in the Vendor table, and an ON DELETE CASCADE action is specified for ProductVendor.VendorID, the Mecanismo de Banco de DadosDatabase Engine checks for one or more dependent rows in the ProductVendor table. Se existir alguma, as linhas dependentes na tabela ProductVendor serão excluídas, além da linha referenciada na tabela Vendor.If any exist, the dependent rows in the ProductVendor table will be deleted, in addition to the row referenced in the Vendor table.

Entretanto, se NO ACTION for especificado, o Mecanismo de Banco de DadosDatabase Engine gerará um erro e reverterá a ação de exclusão da linha Vendor quando houver pelo menos uma linha da tabela ProductVendor que a referencie.Conversely, if NO ACTION is specified, the Mecanismo de Banco de DadosDatabase Engine raises an error and rolls back the delete action on the Vendor row when there is at least one row in the ProductVendor table that references it.

ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT }
Especifica a ação que ocorre nas linhas da tabela alterada, quando essas linhas têm uma relação referencial e a linha referenciada for atualizada na tabela pai.Specifies what action happens to rows in the table altered when those rows have a referential relationship and the referenced row is updated in the parent table. O padrão é NO ACTION.The default is NO ACTION.

NO ACTIONNO ACTION
O Mecanismo de Banco de DadosDatabase Engine gera um erro, e a ação de atualizar na linha da tabela pai é revertida.The Mecanismo de Banco de DadosDatabase Engine raises an error, and the update action on the row in the parent table is rolled back.

CASCADECASCADE
As linhas correspondentes são atualizadas na tabela de referência quando aquela linha é atualizada na tabela pai.Corresponding rows are updated in the referencing table when that row is updated in the parent table.

SET NULLSET NULL
Todos os valores que compõem a chave estrangeira são definidos como NULL quando a linha correspondente na tabela pai é atualizada.All the values that make up the foreign key are set to NULL when the corresponding row in the parent table is updated. Para que essa restrição seja executada, as colunas de chave estrangeira devem ser anuláveis.For this constraint to execute, the foreign key columns must be nullable.

SET DEFAULTSET DEFAULT
Todos os valores que compõem a chave estrangeira são definidos como seus valores padrão quando a linha correspondente na tabela pai é atualizada.All the values that make up the foreign key are set to their default values when the corresponding row in the parent table is updated. Para que essa restrição seja executada, todas as colunas de chave estrangeira devem ter definições padrão.For this constraint to execute, all foreign key columns must have default definitions. Se a coluna for anulável e não houver nenhum valor padrão explícito definido, NULL se tornará o valor padrão implícito para a coluna.If a column is nullable and there is no explicit default value set, NULL becomes the implicit default value of the column.

Não especifique CASCADE se a tabela for incluída em uma publicação de mesclagem que usa registros lógicos.Do not specify CASCADE if the table will be included in a merge publication that uses logical records. Para obter mais informações sobre registros lógicos, consulte Agrupar alterações em linhas relacionadas com registros lógicos.For more information about logical records, see Group Changes to Related Rows with Logical Records.

ON UPDATE CASCADE, SET NULL ou SET DEFAULT não poderá ser definido se um gatilho INSTEAD OF de ON UPDATE já existir na tabela que está sendo alterada.ON UPDATE CASCADE, SET NULL, or SET DEFAULT cannot be defined if an INSTEAD OF trigger ON UPDATE already exists on the table that is being altered.

Por exemplo, no banco de dados do AdventureWorks2012AdventureWorks2012, a tabela ProductVendor tem uma relação referencial com a tabela Vendor.For example, in the AdventureWorks2012AdventureWorks2012 database, the ProductVendor table has a referential relationship with the Vendor table. A chave estrangeira ProductVendor.VendorID faz referência à chave primária Vendor.VendorID.The ProductVendor.VendorID foreign key references the Vendor.VendorID primary key.

Se uma instrução UPDATE for executada em uma linha da tabela Vendor e uma ação ON UPDATE CASCADE for especificada para ProductVendor.VendorID, o Mecanismo de Banco de DadosDatabase Engine verificará se há uma ou mais linhas dependentes na tabela ProductVendor.If an UPDATE statement is executed on a row in the Vendor table and an ON UPDATE CASCADE action is specified for ProductVendor.VendorID, the Mecanismo de Banco de DadosDatabase Engine checks for one or more dependent rows in the ProductVendor table. Se existir alguma, a linha dependente na tabela ProductVendor será atualizada, além da linha referenciada na tabela Vendor.If any exist, the dependent row in the ProductVendor table will be updated, in addition to the row referenced in the Vendor table.

Entretanto, se NO ACTION for especificado, o Mecanismo de Banco de DadosDatabase Engine gerará um erro e reverterá a ação de atualização da linha Vendor quando houver pelo menos uma linha da tabela ProductVendor que a referencie.Conversely, if NO ACTION is specified, the Mecanismo de Banco de DadosDatabase Engine raises an error and rolls back the update action on the Vendor row when there is at least one row in the ProductVendor table that references it.

NOT FOR REPLICATIONNOT FOR REPLICATION
Aplica-se a: SQL Server 2008SQL Server 2008 e posterior.Applies to: SQL Server 2008SQL Server 2008 and later.

Pode ser especificado para restrições FOREIGN KEY e instruções CHECK.Can be specified for FOREIGN KEY constraints and CHECK constraints. Se essa cláusula for especificada para uma restrição, ela não será aplicada quando os agentes de replicação executarem operações insert, update ou delete.If this clause is specified for a constraint, the constraint is not enforced when replication agents perform insert, update, or delete operations.

CHECKCHECK
É uma restrição que impõe a integridade de domínio limitando os possíveis valores que podem ser inseridos em uma ou mais colunas.Is a constraint that enforces domain integrity by limiting the possible values that can be entered into a column or columns.

logical_expressionlogical_expression
É uma expressão lógica usada em uma restrição CHECK e retorna TRUE ou FALSE.Is a logical expression used in a CHECK constraint and returns TRUE or FALSE. logical_expression usada com restrições CHECK não pode fazer referência a outra tabela, mas pode fazer referência a outras colunas na mesma tabela para a mesma linha.logical_expression used with CHECK constraints cannot reference another table but can reference other columns in the same table for the same row. A expressão não pode referenciar um tipo de dados de alias.The expression cannot reference an alias data type.

RemarksRemarks

Quando restrições FOREIGN KEY ou CHECK são adicionadas, todos os dados existentes são verificados quanto a violações de restrição, a menos que a opção WITH NOCHECK seja especificada.When FOREIGN KEY or CHECK constraints are added, all existing data is verified for constraint violations unless the WITH NOCHECK option is specified. Se qualquer violação ocorrer, ALTER TABLE falhará e um erro será retornado.If any violations occur, ALTER TABLE fails and an error is returned. Quando uma nova restrição PRIMARY KEY ou UNIQUE for adicionada a uma coluna existente, os dados na coluna ou colunas deverão ser exclusivos.When a new PRIMARY KEY or UNIQUE constraint is added to an existing column, the data in the column or columns must be unique. Se forem encontrados valores duplicados, ALTER TABLE falhará.If duplicate values are found, ALTER TABLE fails. A opção WITH NOCHECK não tem nenhum efeito quando as restrições PRIMARY KEY ou UNIQUE são adicionadas.The WITH NOCHECK option has no effect when PRIMARY KEY or UNIQUE constraints are added.

Cada restrição PRIMARY KEY e UNIQUE gera um índice.Each PRIMARY KEY and UNIQUE constraint generates an index. O número de restrições UNIQUE e PRIMARY KEY não pode fazer com que o número de índices na tabela exceda 999 índices não clusterizados e 1 índice clusterizado.The number of UNIQUE and PRIMARY KEY constraints cannot cause the number of indexes on the table to exceed 999 nonclustered indexes and 1 clustered index. Restrições de chave estrangeira não geram automaticamente um índice.Foreign key constraints do not automatically generate an index. Entretanto, as colunas de chave estrangeira são frequentemente usadas em critérios de junção de consultas, correspondendo as colunas na restrição de chave estrangeira de uma tabela com as colunas de chave exclusiva ou primária em outra tabela.However, foreign key columns are frequently used in join criteria in queries by matching the column or columns in the foreign key constraint of one table with the primary or unique key column or columns in the other table. Um índice nas colunas de chave estrangeira habilita o Mecanismo de Banco de DadosDatabase Engine a localizar rapidamente dados relacionados na tabela de chave estrangeira.An index on the foreign key columns enables the Mecanismo de Banco de DadosDatabase Engine to quickly find related data in the foreign key table.

ExemplosExamples

Para obter exemplos, consulte ALTER TABLE (Transact-SQL).For examples, see ALTER TABLE (Transact-SQL).

Consulte TambémSee Also

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