2011-08-17 16 views
2

Quelle est la méthode appropriée pour supprimer des lignes de plusieurs tables dans une requête?Supprimer des lignes de plusieurs tables dans une requête

La raison pour laquelle je demande est parce que je le fais avec PHP. Si j'utilise plusieurs requêtes à supprimer de chaque table une à la fois, PHP doit effectuer plusieurs déplacements dans la base de données. Y aura-t-il un effet sur la performance si j'utilise cette méthode?

Je connais l'option ON DELETE CASCADE, mais cela ne fonctionne pas sur tous les moteurs de stockage. En outre, il peut y avoir des situations où je ne veux pas supprimer tous les enregistrements des tables enfant lorsque je supprime l'enregistrement parent.

Répondre

2
DELETE 
    t1, t2 
FROM 
    table1 AS t1 INNER JOIN table2 AS t2 
ON 
    joinCondition 
WHERE 
    whereCondition 

Comme d'habitude avec les requêtes SUPPRIMER: être très prudent

Plus de détails ici: http://dev.mysql.com/doc/refman/5.5/en/delete.html

+0

J'ai entendu dire que la suppression de plusieurs tables à la fois n'est pas préférée. Est-ce parce que la syntaxe ne permet pas l'utilisation de 'LIMIT'? – recount88

+0

En général, il est plus facile de faire une erreur qui effacera beaucoup plus que prévu. Testez vos requêtes bien, et vous ne devriez pas faire de mal. – Mchl

+0

Y at-il une différence de vitesse si j'ai utilisé plusieurs requêtes à supprimer par opposition à un? – recount88

0

Si vous ne connaissez pas la réponse à cette question, alors vous ne devriez pas essayer de soutenir de nombreux RDMS pour votre application. Pour dire carrément. L'option CASCADE est disponible comme toutes les variables relationnelles importantes. En outre, vous devez envisager de stocker des données hiérarchiques, de supprimer des enregistrements enfants.

Par exemple, si vous essayez de supprimer tous les « fichiers » dans un « dossier » lors de l'utilisation Nested Set modèle, il serait tout simplement une question de

DELETE from files where id > :lft and id < :rgt

Mais, en tout cas, vous pouvez toujours supprimer de plusieurs tables en utilisant des suppressions JOIN. Cependant, cette n'est pas prise en charge par beaucoup de RDMS, donc si vous êtes inquiet à propos de l'utilisation de cascade, alors vous ne pourrez jamais utiliser les suppressions jointes dans chaque base de données, même si vous utilisez un DBAL.

La réponse

  • Utilisez un DBAL, comme Doctrine DBAL (pas le ORM), et d'utiliser Cascades où pris en charge.
  • Choisissez une base de données unique, et développez avec ce que vous savez à ce sujet.
0

J'ai également été confronté à un problème similaire. Ma solution était d'écrire ma propre requête min-recusive. Juste une requête et il fait le reste pour vous. Voici comment ça se passe:

// fonction principale

usine de fonction

($ db) {$ table = array ('table1', 'table2', 'table3' ...); // la mienne est allée jusqu'à la table 12
pour ($ i = 0; $ i < '' sizeof ($ table); $ i ++) {
delete ($ db, $ table [$ i]);
}}

// supprimer la fonction .. pourrait ainsi Setit jusqu'à withn la fonction de l'usine, mais 4 saké undestanging

supprimer ($ db, table de $) {

$ sql = 'supprimer de'. $ table; if ($ db-> query ($ sql)) {echo ucfirst ($ table).'supprimer terminé 100%';

}

}

C'est tout ... pour faire du travail pour le tableau d'insertion non prédéfini, crète un varible pour maintenir la taille du tableau à partir de votre page d'entrée de données et modifier la suppression de ' insérer dans la table 'prepare statement et execute. J'espère que cela vous a aidé d'une certaine façon

Questions connexes