J'ai 4 tables. Dans la première table a appid comme clé primaire et dans les trois autres table sa clé étrangère. Je veux supprimer des données de toutes les trois dans une requête. J'ai essayé de mon mieux mais j'ai échoué. Quelqu'un peut-il aider?Supprimer des enregistrements de plusieurs tables simultanément?
Répondre
Vous ne pouvez pas écrire une instruction delete faisant référence à plusieurs tables, vous devez écrire 4 instructions delete. Toutefois, si nécessaire, vous pouvez définir les clés étrangères des trois tables enfants sur "ON DELETE CASCADE". Ensuite, lorsque vous supprimez de la table parent, toutes les lignes associées des 3 tables enfants sont également supprimées. Cela peut être utile parfois, mais je ne le recommanderais pas comme une pratique générale car cela peut être dangereux et déroutant pour les développeurs.
Pouvez-vous développer la nature dangereuse et déroutante des clés étrangères en cascade? Parce que je suis un peu surpris par cette remarque. – Rene
@Rene, OK Bien que je travaille actuellement sur un projet où quelqu'un a mis en place beaucoup de clés étrangères comme ON DELETE CASCADE. Ainsi, par exemple, si un utilisateur fait quelque chose comme 'DELETE order_status_lookup WHERE status_code = 'SHIPPED'' alors il réussit et tous les ordres avec le statut' SHIPPED 'sont également supprimés. J'appelle ça un mais dangereux! J'utilise réellement ON DELETE CASCADE, mais seulement là où cela a vraiment du sens. –
Donc, ce que vous dites, c'est que c'est un outil qui peut être très utile mais qui peut être dangereux. Un peu comme une tronçonneuse n'est-ce pas? Mais recommanderiez-vous de couper tous ces arbres manuellement? – Rene
Il n'existe aucun moyen de supprimer de nombreuses tables avec une seule instruction, mais la meilleure question est pourquoi devez-vous supprimer de toutes les tables en même temps? Il me semble que vous ne comprenez pas complètement comment les transactions fonctionnent dans Oracle. Disons que vous vous connectez et supprimez une ligne de la table 1, mais ne commettez pas. En ce qui concerne toutes les autres sessions, cette ligne n'a pas été supprimée. Si vous ouvrez une autre connexion et interrogez la ligne, elle sera toujours présente.
Ensuite, vous supprimez à tour de rôle les tableaux 2, 3 et 4. Vous n'avez toujours pas validé la transaction, de sorte que toutes les autres sessions de la base de données peuvent toujours voir les lignes supprimées.
Ensuite, vous validez. En même temps, les autres sessions ne verront plus les lignes que vous avez supprimées des 4 tables, même si vous avez effectué les suppressions dans 4 instructions distinctes.
Je pense que vous êtes un peu dur. Je peux voir le mérite dans une syntaxe 'DELETE ALL' analogue à' INSERT ALL': il serait utile de zapper tous les enregistrements liés dans un ensemble de tables sans avoir à se soucier des dépendances et sans utiliser de contraintes différées. (Bien que j'admette que mon besoin en soit de gérer des données de test plutôt que dans des environnements de production). – APC
+1 Pour une réponse claire et précise. – Rene
Si la base de données est Mysql, vous pouvez utiliser join dans l'instruction DELETE. Voir http://dev.mysql.com/doc/refman/5.0/en/delete.html pour plus d'informations.
Mais ce n'est pas le cas. C'est Oracle. –
Outre un autre commentaire (transaction ou suppression de cascade), vous pouvez utiliser le déclencheur pour la suppression des tables enfant. –
- 1. enregistrements Supprimer de plusieurs tables
- 2. supprimer des enregistrements de 2 tables
- 3. Interrogation plusieurs tables mySQL simultanément
- 4. Mysql - supprimer plusieurs tables
- 5. Suppression de plusieurs enregistrements de deux tables
- 6. CakePHP, deux tables, plusieurs enregistrements
- 7. Comment supprimer deux enregistrements de deux tables?
- 8. devez supprimer les enregistrements des tables principales de production
- 9. Supprimer des enregistrements associés de plusieurs tables à l'aide de modèles T4 subsoniques
- 10. N ° de comptage des enregistrements de plusieurs tables; Oracle DB
- 11. Supprimer de plusieurs tables ASP.NET
- 12. Supprimer des lignes de plusieurs tables dans une requête
- 13. Récupérer des enregistrements de plusieurs tables certaines distinctes, d'autres non
- 14. Comparaison de plusieurs tables Mysql pour trouver des enregistrements modifiés
- 15. Trouver des enregistrements non-dupliqués à partir de plusieurs tables
- 16. dans toutes les tables et supprimer des enregistrements
- 17. jQuery afficher 5 enregistrements sur plusieurs tables
- 18. Requête SQL pour plusieurs tables/enregistrements
- 19. php/mysql créer des enregistrements en double avec plusieurs tables
- 20. Supprimer plusieurs tables sans jointure
- 21. Est-il possible d'ajouter une colonne à plusieurs tables simultanément?
- 22. supprimer des enregistrements de 2 tables après le test pour voir si elles sont des doublons
- 23. Mysqli supprimer la ligne de plusieurs tables
- 24. MySQL: Interroger deux tables simultanément
- 25. comment supprimer les enregistrements de plusieurs tables enfants dans la même requête
- 26. Supprimer des lignes de plusieurs tables avec une jointure
- 27. Comment supprimer de plusieurs tables dans MySQL?
- 28. SUPPRIMER à partir de plusieurs tables associées
- 29. Comment supprimer des enregistrements de joinTable qui a plusieurs à plusieurs JPA
- 30. Comment supprimer l'enregistrement de deux ou plusieurs tables
C'est le problème que l'action référentielle 'ON DELETE CASCADE' a été inventée pour résoudre. Contrairement à @ Tony Andrews, je le recommande comme pratique générale. – onedaywhen