2009-09-02 6 views

Répondre

4

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.

1

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.

+2

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

+1

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

+0

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

0

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:

  1. Construire une vue sur une jointure des tables.
  2. Ajouter un déclencheur INSTEAD OF, codé pour supprimer les lignes appropriées des deux tables. Pas vraiment recommandé, mais vous pourriez le faire.
1

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.

0

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.

Questions connexes