Eu criei uma tabela com uma restrição de chave estrangeira nela. Quando gero um script de criação de tabela por meio do SSMS, ele cria o seguinte código:
ALTER TABLE [dbo].[MainTable] WITH CHECK ADD CONSTRAINT [FK_MainTable_ForeignKeyTable] FOREIGN KEY([FK_Field])
REFERENCES [dbo].[ForeignKeyTable] ([PK_Field])
GO
ALTER TABLE [dbo].[MainTable] CHECK CONSTRAINT [FK_MainTable_ForeignKeyTable]
GO
Como a primeira instrução cria a restrição WITH CHECK, isso torna a segunda instrução redundante? Se não, o que o CHECK CONSTRAINT está realizando que o WITH CHECK não?
Eu vi ALTER TABLE CHECK CONSTRAINT , mas nesse caso, o SSMS está gerando a primeira instrução WITH NOCHECK, então faz sentido ter ambas as instruções.
A primeira instrução altera a tabela para adicionar a restrição. A segunda instrução habilita ou desabilita a restrição para futuras inserções ou atualizações.
Assim,
ALTER TABLE ... CHECK CONSTRAINT ...
habilita a restrição para futuras inserções/atualizações. Se você especificarALTER TABLE ... NOCHECK CONSTRAINT ...
, isso desabilitará a restrição, permitindo assim que futuras inserções e atualizações sejam bem-sucedidas, mesmo que a coluna na tabela referenciada pela chave estrangeira não contenha um valor correspondente. Você pode ver a utilidade de ter ambas as instruções presentes por meio deste exemplo:Assim, criamos duas tabelas que não possuem um relacionamento definido. Mais tarde, decidimos que queremos projetar o relacionamento, então adicionamos uma chave estrangeira
dbo.b
que faz referência à coluna de chave primária emdbo.a
. Queremos que as linhas existentes sejam verificadas quanto à validade, mas não nos importamos com novas linhas que podem ser adicionadas no futuro 1 .Tudo certo. As linhas existentes foram validadas e as novas linhas não serão validadas em relação à chave estrangeira:
O conteúdo da tabela:
Resultados:
Portanto, como o código que cria scripts de tabelas no SSMS deve cobrir todas as eventualidades, ele gera um
ALTER TABLE ... CHECK CONSTRAINT ...
mesmo que não seja necessário e, na grande maioria dos casos, certamente não é necessário.1 - por que alguém iria querer que as linhas existentes fossem validadas, mas não se importar com as novas linhas é um pouco misterioso, mas aí está.