2010-08-27 5 views
4

J'ai trois tables. produit, entreprise, employéCascade Delete Query

ProductId de la table des produits est essentielle foregin pour la société et COMPANYID de la table Company est la clé foregin pour les employés

Donc, sur la suppression ProductId du tableau des produits, tous les documents connexes dans d'autres tableaux doivent effacer. Mais je ne peux pas toucher le schéma (ne peut pas utiliser alter table). Comment dois-je écrire la requête dans ce cas ..

Répondre

7

Si vous ne pouvez pas ajouter des contraintes qui se propage la suppression, vous devez écrire tout le nécessaire vous supprime:

delete employee where companyid in (select companyid from company c where productid = xxx); 
delete company where productid=xxx; 
delete product where productid=xxx; 
+0

alors est-ce que j'ai besoin d'écrire les 3 requêtes, ne peut pas être fait en un seul? – Nits

+0

Non. Mais vous pouvez écrire une procédure stockée autour de ces 3 requêtes. – pascal

+1

Je pense qu'il y a une bonne raison à cela. Si vous voulez des suppressions en cascade, faites une contrainte référentielle avec l'option "ON DELETE CASCADE". Mais dans certains cas, vous ne le voudriez tout simplement pas, car le danger de supprimer beaucoup plus que prévu est grand. Par exemple, vous ne voulez certainement pas supprimer un élément de facture juste parce que quelqu'un essaie de supprimer le produit qui a été vendu. S'il y avait une option "CASCADE" pour l'instruction DELETE, les gens l'utiliseraient sans savoir combien de dégâts ils causent. –

0

Essayez cette option. Je n'ai pas d'environnement pour tester ça. Je suppose qu'avec quelques changements cela devrait marcher à votre fin.

DELETE Product,Company,Employee 
FROM 
user LEFT JOIN items ON product.productid = company.productid 
LEFT JOIN orders ON company.productid = product.productid 
WHERE product.productid = [$productid] 
+0

Vous ne pouvez pas placer de jointures dans une instruction delete –

Questions connexes