Les suppressions en cascade ne sont pas configurées sur cette base de données particulière. Je me demandais simplement s'il y avait un moyen de le faire d'un seul coup plus efficace que d'exécuter deux énoncés distincts.Est-il possible de supprimer les enregistrements maître ET de détail dans une instruction SQL?
Répondre
No.
Vous pouvez faire deux déclarations sur une seule commande:
DE SUPPRIMER ChildTable; DELETE FROM ParentTable;
Mais en fait c'est deux instructions.
ou
Vous pouvez mettre un déclencheur sur la ChildTable qui supprime les enregistrements parents.
Aucun de ces critères ne correspond à vos critères.
devrait être dans une transaction - il peut être moins efficace, mais beaucoup mieux pour l'intégrité des données
BEGIN TRAN
DELETE FROM ChildTable WHERE safetycatch=0
DELETE FROM ParentTable WHERE safetycatch=0
COMMIT TRAN
Edition - si vous voulez vraiment utiliser une seule déclaration que vous pouvez ensuite créer une procédure stockée par exemple
CREATE PROCEDURE DeleteBoth AS
BEGIN TRAN
DELETE FROM ChildTable WHERE safetycatch=0
DELETE FROM ParentTable WHERE safetycatch=0
--ERROR HANDLING IF STUFF GOES WRONG THEN ROLLBACK TRAN
COMMIT TRAN
GO
alors vous pouvez l'exécuter en une ligne à partir de là avec
EXEC DeleteBoth
Avec un plan d'exécution mis en cache, j'imagine que la différence de performance serait négligeable par rapport à une suppression en cascade comme c'est à peu près ce qui est aller dans les coulisses de toute façon.
Comme le mentionne Nissan Fan, les déclencheurs le feraient. Comme le suggère wefwfwefwe, utilisez une transaction si elle doit être tout ou rien.
Selon la façon dont vous êtes désespérés, vous pouvez combiner les deux dans une trop complexe moyen de le faire avec une seule déclaration publiée à la base de données:
- Construire une vue sur une jointure des tables.
- Ajouter un déclencheur INSTEAD OF, codé pour supprimer les lignes appropriées des deux tables. Pas vraiment recommandé, mais vous pourriez le faire.
Oui, mais uniquement si vous définissez la relation de clé étrangère et utilisez l'option ON DELETE CASCADE.
Tout le reste nécessitera deux instructions, même si les instructions se trouvent dans la même transaction.
Normalement, il y a une bonne raison de ne pas configurer les suppressions en cascade (souvent en rapport avec le blocage et les verrouillages). Comme ils ne sont pas configurés, vous devez écrire des instructions de suppression distinctes pour toutes les tables enfant et parent. Je suggère que le meilleur moyen est dans un proc stocké en utilisant des transactions que vous ne voulez pas faire des suppressions partielles si vous vous souciez de l'intégrité de vos données. Assurez-vous d'avoir un piégeage d'erreur et des annulations.
- 1. Comment insérer des enregistrements dans une relation maître/détail
- 2. Afficher les enregistrements du tableau maître/maître-détail en utilisant requête SQL uniquement
- 3. DDD, entités apparentées dans les relations de détail maître
- 4. Exemple de détail maître de Rails
- 5. Vue maître-détail ASP.NET MVC
- 6. Exemple de page ASP.NET maître/détail où les détails sont dans une visionneuse?
- 7. Utilisation de MS SQL Server 2005, comment consolider les enregistrements de détail dans une seule liste séparée par des virgules
- 8. Formulaire maître/détail dans Axapta/Dynamics Axe
- 9. Aide maître/détail nécessaire pour newbie ASP.NET. (capture d'écran aussi)
- 10. Colonne de sélection Datagridview pour la relation maître-détail
- 11. Implémentation d'un scénario maître-détail simple pour WPF dans MVVM
- 12. Meilleure façon de lier les contrôles dans deux fenêtres dans la situation maître-détail
- 13. Comment supprimer tous les enregistrements d'une table ayant des enregistrements correspondants dans une autre table
- 14. supprimer des enregistrements de 2 tables
- 15. Est-il possible de supprimer les statistiques SQL?
- 16. Utilisation de LINQ pour supprimer automatiquement les enregistrements enfants
- 17. Pourquoi mon instruction SQL compte-t-elle différents champs de tables différentes dans une instruction SQL?
- 18. Supprimer les enregistrements de la base de données avec une requête Ajax
- 19. Sélectionnez et EXEC dans une seule instruction - Serveur SQL
- 20. Requête SQL - Supprimer les doublons si plus de 3 tours?
- 21. limite de SQL pour les enregistrements uniques
- 22. Est-il possible d'utiliser une instruction Case dans un SQL? De la clause From
- 23. LINQ To SQL - Quel est le moyen le plus efficace de passer en revue le maître/détail?
- 24. comment obtenir des enregistrements d'un fichier pour utiliser ces enregistrements dans une instruction select?
- 25. Supprimer tous les enregistrements d'une table
- 26. Est-il possible de supprimer toutes les contraintes de clé étrangère sur une table à la fois dans mySQL 5?
- 27. instruction SQL JOIN et WHERE
- 28. Toad Ajouter/Insérer et supprimer des enregistrements Bouton Désactivé
- 29. Comment extraire les enregistrements et tous les enregistrements enfants dans une base de données dans les entités ADO.NET?
- 30. Récupération des données de MySQL dans une instruction SQL
Il convient d'être prudent sur ces exemples. Supprimer de ChildTable et Delete de ParentTable supprimera TOUTES les entrées de ces tables. N'oubliez pas de lancer une instruction WHERE dans vos requêtes afin d'éviter ce problème. – Chris
N'écrivez jamais un proc qui a un commit tran sans un moyen d'intercepter les erreurs et de revenir en arrière s'il y en a. Aussi Chris a raison, en mettant un exemple de suppressions sans clause où les clauses sont carrément dangereuses. – HLGEM
J'aurais espéré que c'était évident ... ajouté où les clauses et le pseudocode de gestion des erreurs de toute façon. Maintenant arrête de me rabaisser! – wefwfwefwe