Ajout de contraintes de key étrangère aux colonnes existantes

J'ai une database qui a subi des transformations majeures au cours de plusieurs années de la participation de plusieurs codeurs différents. Certaines tables contiennent des references à d'autres données via une colonne de reference, mais n'ont pas de contraintes de key étrangère. Cela signifie qu'il y a des tables qui peuvent contenir des liens morts.

Je voudrais append des contraintes de key étrangère à toutes les colonnes de reference. Comment puis-je m'assurer que ce serait un succès quand certaines données pourraient referencer des liens morts et d'autres pourraient être nuls.

Je pense que je dois dire quelque chose comme ça:

ALTER TABLE dbo.Users ADD CONSTRAINT FK_Users_Persons FOREIGN KEY ( Person_ID --In some cases Person_ID will be null ) REFERENCES dbo.People ( Person_ID ) ON UPDATE NO ACTION ON DELETE NO ACTION NOT FOR REPLICATION GO ALTER TABLE dbo.Users NOCHECK CONSTRAINT FK_Users_Persons GO COMMIT 

S'il vous plaît laissez-moi savoir si cela est exact et aussi s'il y a des pièges cachés?

Merci d'avance

Essayez-le !! S'il y a un problème – une valeur qui n'existe pas dans la table référencée – SQL Server vous le dira, et rien de mal n'arrivera – croyez-moi! 🙂

Sérieusement: s'il y a des problèmes, par exemple des lignes dans les Users qui ont des valeurs Person_ID invalides, alors SQL Server ne créera pas la contrainte FK – aussi simple que cela.

Dans ce cas, si vous avez des inputs dans la table Users qui ne referencent pas un Person_ID valide dans la table Person , vous devrez d'abord les corriger. Vous pouvez les définir sur NULL (si vous ne parvenez pas à Person_ID personne à laquelle ils font reference) ou les définir sur un Person_ID valide, puis réessayer d'append votre contrainte FK.

Vous pouvez également find ces inputs avant d'appliquer la contrainte FK avec une requête semblable à ceci:

  SELECT (columns) FROM dbo.Users WHERE Person_ID IS NOT NULL AND Person_ID NOT IN (SELECT DISTINCT Person_ID FROM dbo.Person) 

Utilisez une LEFT JOIN . Cela affichera NULL sur les éléments qui ne peuvent pas être joints, ce qui signifie que la reference a été supprimée.