2017-07-17 1 views
-1

Quelle est la différence entre ces scripts?Différence entre WITH NOCHECK CHECK CONSTRAINT et CHECK CONSTRAINT

ALTER TABLE Post_Send WITH NOCHECK CHECK CONSTRAINT [My_FOREIGN_KEY]; 
GO 

ALTER TABLE Post_Send CHECK CONSTRAINT [My_FOREIGN_KEY]; 
GO 
+0

dépend si table a déjà des données .. mais en ajoutant une clé étrangère et en le disant à NOCHECK est inutile et plutôt bête IMO –

+0

Ils montrent le même effet. –

Répondre

0

CHECK CONSTRAINT permet une contrainte. (Oui, cela aurait dû être ENABLE à la place.) WITH NOCHECK le fait sans vérifier les données existantes. Ainsi, la syntaxe confuse WITH NOCHECK CHECK CONSTRAINT active une contrainte sans vérifier les données existantes.

De the manual:

Indique si les données de la table est ou non validée par rapport un FOREIGN KEY ou CHECK nouvellement ajoutés ou réactivées contrainte. Si ce n'est pas spécifié, WITH CHECK est supposé pour les nouvelles contraintes, et WITH NOCHECK est supposé pour les contraintes ré-activées.

Puisque vous réactivant une contrainte existante, WITH NOCHECK est la valeur par défaut, et ces deux déclarations font exactement la même chose. WITH CHECK CHECK CONSTRAINT réactiverait la contrainte tout en vérifiant également les données existantes pour les violations (et en marquant la clé étrangère comme fiable pour les optimisations dans le processus, ce qui ne se produit pas si vous passez outre la vérification).