2011-02-09 5 views
1
DELETE FROM Profile, Images, Schedules 
USING Profile 
INNER JOIN Images USING(profile_id) 
INNER JOIN Schedules USING(profile_id) 
    WHERE Profile.profile_id = 47 

J'ai ce morceau de code mysql qui supprime tous les enregistrements qui a le profil 47. Cependant, disons les annexes ne sont pas 47, l'ensemble ne marche pas de requête supprimer l'autre enregistrements des autres tables.requête Sql ne fonctionne que si tous les enregistrements existent

Fondamentalement, je veux qu'il supprime tout, peu importe si les horaires a un enregistrement ou non.

L'autre option est l'interrogation de la base de données pour vérifier la table Schedules avant d'effectuer la requête de suppression?

+1

alors pourquoi faites-vous le INNER JOIN? – rkg

Répondre

0

Utilisez une jointure externe pour accéder aux tables qui pourraient ne pas avoir documents à l'appui:

DELETE FROM p, i, s 
     USING PROFILE p 
    LEFT JOIN IMAGES i ON i.profile_id = p.profile_id 
    LEFT JOIN SCHEDULES s ON s.profile_id = p.profile_id 
     WHERE p.profile_id = 47 

est ici un good primer on JOINs.

0

Vous pouvez simplement passer à JOIN. GAUCHE. cela supprime Profile where id=47 + les enregistrements associés trouvés dans Images et planifications.

DELETE FROM Profile, Images, Schedules 
USING Profile 
LEFT JOIN Images USING(profile_id) 
LEFT JOIN Schedules USING(profile_id) 
    WHERE Profile.profile_id = 47 
2

est-il pas plus simple à faire:

BEGIN; 
DELETE FROM Schedules WHERE Profile_ID = 47; 
DELETE FROM Images WHERE Profile_ID = 47; 
DELETE FROM Profile WHERE Profile_ID = 47; 
COMMIT; 

Et WRAP dans une procédure stockée, le cas échéant.

+0

intéressant. Je n'ai jamais vu cette méthode avant ... Est-ce que ça agit comme une seule requête? – Adam

+0

En théorie oui, c'est le A de ACID (http://en.wikipedia.org/wiki/ACID) En pratique cela dépend des dbms et du moteur que vous utilisez. –

+0

Pourquoi dans trois/etc requêtes ce que vous pouvez faire dans un? @Adam: SQL Server et MySQL sont les seuls DB que je connaisse qui supportent les JOINs dans les instructions DELETE - c'est votre seule option sur Oracle, dernière fois que j'ai vérifié. –

Questions connexes