Comment puis-je obtenir tous les enregistrements orphelins en une seule requête?


8

Je viens de remarquer quelques tables contenant des enregistrements orphelins (clés étrangères) qui ne pointent plus vers aucune clé primaire. Comment puis-je interroger les tables pour obtenir une liste de toutes ces lignes? Quand ces enregistrements parents ont-ils été supprimés ou comment gérer cela?

J'utilise SQL Server 2008 R2 et nous essayons d'importer 3 bases de données similaires dans une seule après le nettoyage, veuillez en informer.

Scripté un exemple de table enfant (DocumentDistribution) et de table parent (DocumentSource):

ALTER TABLE [dbo].[DocumentDistribution] WITH NOCHECK ADD CONSTRAINT [fk_documentdistsourceid_documentsourceid] FOREIGN KEY([DocumentDistSourceID]) REFERENCES [dbo].[DocumentSource] ([DocumentSourceID]) 
GO
 ALTER TABLE [dbo].[DocumentDistribution] CHECK CONSTRAINT [fk_documentdistsourceid_documentsourceid] 

Cela ne me dit-il pas que les tables sont en relations et définissent explicitement les contraintes de clé étrangère?

Réponses:


20

Cela ne devrait être possible que si vous avez une relation entre des tables que vous connaissez, mais pas SQL Server.

SELECT fk 
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Désormais, à l'avenir, définissez cette relation de manière explicite, les utilisateurs ne pourront plus supprimer les lignes parents tant que les lignes enfants existent toujours. Pour supprimer les lignes qui ne devraient pas y figurer aujourd'hui:

DELETE c
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Ensuite, retirez-leur le droit de désactiver ces contraintes afin qu'ils cessent de le faire dans le mauvais sens.


Vous pouvez également effectuer l'action inverse en changeant les tables enfant et parent. Cela supprimerait toutes les lignes parentes qui ne sont pas référencées par la table enfant - les parents orphelins, si vous voulez.
djule5
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.