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.