ALTER TABLE column_constraint (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure
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.
Convenções de sintaxe de Transact-SQL
Sintaxe
Sintaxe para SQL Server, Banco de Dados SQL do Azure, Instância Gerenciada de SQL do Azure, Banco de dados SQL no Microsoft Fabric
[ 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 )
}
Sintaxe do Microsoft Fabric Warehouse
[ CONSTRAINT constraint_name ]
{
{ PRIMARY KEY | UNIQUE }
NONCLUSTERED
(column [ ASC | DESC ] [ ,...n ] )
NOT ENFORCED
| FOREIGN KEY
( column [ ,...n ] )
REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]
NOT ENFORCED
}
Argumentos
CONSTRAINT
Especifica o início da definição para uma restrição PRIMARY KEY, UNIQUE, FOREIGN KEY ou CHECK.
constraint_name
É o nome da restrição. 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 (#). Se constraint_name não for fornecido, um nome gerado pelo sistema será atribuído à restrição.
NULL | NOT NULL
Especifica se a coluna pode aceitar valores nulos. Colunas que não aceitam valores nulos podem ser adicionadas somente se tiverem um padrão especificado. Se a nova coluna permitir valores nulos e nenhum padrão for especificado, ela será NULL para cada linha da tabela. 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.
Se a nova coluna não permitir valores nulos, uma definição DEFAULT deverá ser adicionada a ela. A nova coluna é carregada automaticamente com o valor padrão nas novas colunas em cada linha existente.
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. Isso afeta a capacidade de alterar o conteúdo da tabela enquanto o bloqueio estiver em vigor. 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.
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. 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. Para obter mais informações, confira CREATE TABLE.
PRIMARY KEY
É uma restrição que impõe a integridade de entidade para uma coluna ou colunas especificadas usando um índice exclusivo. Somente uma restrição PRIMARY KEY pode ser criada para cada tabela.
UNIQUE
É uma restrição que fornece a integridade de entidade para uma coluna ou colunas especificadas usando um índice exclusivo.
CLUSTERED | NONCLUSTERED
Especifica que um índice clusterizado ou não clusterizado é criado para a restrição PRIMARY KEY ou UNIQUE. As restrições PRIMARY KEY usam como padrão CLUSTERED. As restrições UNIQUE usam como padrão NONCLUSTERED.
Se uma restrição ou índice clusterizado já existir em uma tabela, CLUSTERED não poderá ser especificado. Se uma restrição ou índice clusterizado já existir em uma tabela, as restrições PRIMARY KEY usam como padrão 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.
No Microsoft Fabric Warehouse, NONCLUSTERED não tem efeito.
WITH FILLFACTOR =fillfactor
Especifica o quanto o Mecanismo de Banco de Dados deve preencher cada página de índice usada para armazenar os dados de índice. Os valores de fator de preenchimento especificados pelo usuário podem ser de 1 a 100. Se um valor não for especificado, o padrão será 0.
Importante
A documentação como a única opção de WITH FILLFACTOR
índice que se aplica a restrições PRIMARY KEY ou UNIQUE é mantida para compatibilidade com versões anteriores, mas não será documentada dessa maneira em versões futuras. Outras opções de índice podem ser especificadas na cláusula index_option de ALTER TABLE.
ON { partition_scheme_name(partition_column_name) | filegroup | default }
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
Especifica o local de armazenamento do índice criado para a restrição. 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. Se filegroup for especificado, o índice será criado no grupo de arquivos nomeado. 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. 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.
Nesse contexto, default não é uma palavra-chave. É um identificador para o grupo de arquivos padrão e precisa ser delimitado, como em ON default
ou ON [default]
. Se default for especificado, a QUOTED_IDENTIFIER
opção deverá estar ON para a sessão atual. Essa é a configuração padrão. Para obter mais informações, confira SET QUOTED_IDENTIFIER (Transact-SQL).
NOT ENFORCED
No Microsoft Fabric Warehouse, as restrições de chave primária, chave exclusiva e chave estrangeira exigem NOT ENFORCED. A integridade das restrições deve ser mantida pelo aplicativo.
FOREIGN KEY REFERENCES
É uma restrição que fornece integridade referencial para obter dados na coluna. As restrições FOREIGN KEY exigem que cada valor na coluna exista na coluna especificada na tabela referenciada.
schema_name
É o nome do esquema ao qual pertence a tabela referenciada pela restrição FOREIGN KEY.
referenced_table_name
É a tabela referenciada pela restrição FOREIGN KEY.
ref_column
É uma coluna entre parênteses referenciada pela nova restrição FOREIGN KEY.
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. O padrão é NO ACTION.
NO ACTION
O Mecanismo de Banco de Dados do SQL Server gera um erro e a ação de excluir na linha da tabela pai é revertida.
CASCADE
As linhas correspondentes serão excluídas da tabela de referência se aquela linha for excluída da tabela pai.
SET NULL
Todos os valores que compõem a chave estrangeira são definidos como NULL quando a linha correspondente na tabela pai é excluída. Para que essa restrição seja executada, as colunas de chave estrangeira devem ser anuláveis.
SET 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. Para que essa restrição seja executada, todas as colunas de chave estrangeira devem ter definições padrão. 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.
Não especifique CASCADE se a tabela for incluída em uma publicação de mesclagem que usa registros lógicos. Para obter mais informações sobre registros lógicos, consulte Agrupar alterações em linhas relacionadas com registros lógicos.
ON DELETE CASCADE não poderá ser definido se um disparador INSTEAD OF ON DELETE já existir na tabela que está sendo alterada.
Por exemplo, no banco de dados AdventureWorks2022
, a tabela ProductVendor
tem uma relação referencial com a tabela Vendor
. O ProductVendor
.VendorID
A chave estrangeira faz referência ao Vendor
.VendorID
chave primária.
Se uma instrução DELETE for executada em uma linha da Vendor
tabela e uma ação ON DELETE CASCADE for especificada para ProductVendor
.VendorID
, o Mecanismo de Banco de Dados verificará se há uma ou mais linhas dependentes na ProductVendor
tabela. Se houver, as linhas dependentes na ProductVendor
tabela serão excluídas, além da linha referenciada Vendor
na tabela.
Por outro lado, se NO ACTION for especificado, o Mecanismo de Banco de Dados gerará um erro e reverterá a ação de exclusão na Vendor
linha quando houver pelo menos uma linha na ProductVendor
tabela que faça referência a ela.
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. O padrão é NO ACTION.
NO ACTION
O Mecanismo de Banco de Dados gera um erro, e a ação de atualizar na linha da tabela pai é revertida.
CASCADE
As linhas correspondentes são atualizadas na tabela de referência quando aquela linha é atualizada na tabela pai.
SET NULL
Todos os valores que compõem a chave estrangeira são definidos como NULL
quando a linha correspondente na tabela pai é atualizada. Para que essa restrição seja executada, as colunas de chave estrangeira devem ser anuláveis.
SET 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. Para que essa restrição seja executada, todas as colunas de chave estrangeira devem ter definições padrão. Se uma coluna for anulável e não houver nenhum valor padrão explícito definido, NULL
torna-se o valor padrão implícito da coluna.
Não especifique CASCADE se a tabela for incluída em uma publicação de mesclagem que usa registros lógicos. Para obter mais informações sobre registros lógicos, consulte Agrupar alterações em linhas relacionadas com registros lógicos.
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.
Por exemplo, no banco de dados AdventureWorks2022
, a tabela ProductVendor
tem uma relação referencial com a tabela Vendor
. O ProductVendor
.VendorID
A chave estrangeira faz referência ao Vendor
.VendorID
chave primária.
Se uma instrução UPDATE for executada em uma linha da Vendor
tabela e uma ON UPDATE CASCADE
ação for especificada para ProductVendor
.VendorID
, o Mecanismo de Banco de Dados verificará se há uma ou mais linhas dependentes na ProductVendor
tabela. Se houver, a linha dependente ProductVendor
na tabela será atualizada, além da linha referenciada Vendor
na tabela.
Por outro lado, se NO ACTION for especificado, o Mecanismo de Banco de Dados gerará um erro e reverterá a ação de atualização na Vendor
linha quando houver pelo menos uma linha na ProductVendor
tabela que faça referência a ela.
NOT FOR REPLICATION
Aplica-se a: SQL Server 2008 (10.0.x) e posterior.
Pode ser especificado para restrições FOREIGN KEY e instruções CHECK. 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.
CHECK
É 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.
logical_expression
É uma expressão lógica usada em uma restrição CHECK e retorna TRUE ou 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. A expressão não pode referenciar um tipo de dados de alias.
Comentários
Quando as 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 WITH NOCHECK
opção seja especificada. Se qualquer violação ocorrer, ALTER TABLE falhará e um erro será retornado. 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. Se forem encontrados valores duplicados, ALTER TABLE falhará. A WITH NOCHECK
opção não tem efeito quando as restrições PRIMARY KEY ou UNIQUE são adicionadas.
Cada restrição PRIMARY KEY e UNIQUE gera um índice. 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. Restrições de chave estrangeira não geram automaticamente um índice. 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. Um índice nas colunas de chave estrangeira habilita o Mecanismo de Banco de Dados a localizar rapidamente dados relacionados na tabela de chave estrangeira.
Exemplos
Para obter exemplos, confira ALTER TABLE (Transact-SQL).