Delete sur plusieurs tables...

Eléphant du PHP | 226 Messages

19 juin 2008, 14:47

Bonjour,

Bien qu'après avoir lu la documentation à propos de delete, je n'arrive toujours pas à formaliser correctement la requête que je voudrais établir. Requête qui doit toucher 3 tables. Donc, dans l'ordre:
Version de MySQL:5.0.45
Structure des tables concernées:

Code : Tout sélectionner

CREATE TABLE `apprentis` ( `CiviliteApp` varchar(4) character set utf8 collate utf8_unicode_ci default NULL, `NomApp` varchar(20) character set utf8 collate utf8_unicode_ci default NULL, `... `[b]idapp` int(5) NOT NULL auto_increment,[/b] `Actif` varchar(1) character set utf8 collate utf8_unicode_ci NOT NULL, KEY `idapp` (`idapp`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=344 ; CREATE TABLE `commentaires` ( `date` varchar(10) default NULL, ... [b]`idapp` int(5) NOT NULL default '0',[/b] `lu` int(5) NOT NULL default '0', `idcomm` int(5) NOT NULL auto_increment, KEY `idcomm` (`idcomm`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=791 ; CREATE TABLE `suiviapprentis` ( `DateDebutContrat` varchar(10) NOT NULL default '', `DateFinContrat` varchar(10) NOT NULL default '', `... [b]`idapp` int(5) NOT NULL default '0',[/b] `Diplome` varchar(50) NOT NULL default '', ... `idsession` int(2) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
et voilà en question la requête que je voudrais corriger :

Code : Tout sélectionner

$delete= 'DELETE apprentis, commentaires, suiviapprentis FROM apprentis, commentaires, suiviapprentis WHERE apprentis.idapp=commentaires.idapp AND commentaires.idapp=suiviapprentis.idapp AND apprentis.idapp=\''.$idApp.'\';';
J'avoue pour l'instant ne pas comprendre le problème...
merci,
«Le matin, quand il t’en coûte de te réveiller, que cette pensée te soit présente: c’est pour faire œuvre d’homme que je m’éveille.»
Marc Aurèle.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 juin 2008, 14:59

Commencer par faire un SELECT qui sélectionne les données à effacer et remplace le "SELECT [liste des champs] FROM" par "DELETE".

Après, je ne me suis jamais posé la question de supprimer des données sur plusieurs tables simultanément :?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 396 Messages

19 juin 2008, 15:04

Il me semble qu'il faut que tu fasses

Code : Tout sélectionner

DELETE table1.*, table2.* etc...
Mais fais attention, sois sûr que tes conditions soient correctes avant d'executer ta requête... Fais un SELECT comme te le conseille zeus

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 juin 2008, 15:17

pourquoi table1.* ?

On écrit

Code : Tout sélectionner

DELETE FROM table WHERE condition
pas

Code : Tout sélectionner

DELETE * FROM table WHERE condition
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 396 Messages

19 juin 2008, 15:21

Dans le cadre de DELETE sur plusieurs tables (puisque c'est la question :p )
Je le fais comme ça pour ma part en tout cas et ça fonctionne.

Eléphant du PHP | 396 Messages

19 juin 2008, 15:23

Ce qui permet de faire

Code : Tout sélectionner

DELETE t1.*, t2.* FROM t1, t2, t3 WHERE t1.xx=t2.xx AND t2.yy=t3.yy
On utilise t3 pour la clause WHERE sans pour autant effacer quoique ce soit sur cette table.

Eléphant du PHP | 226 Messages

19 juin 2008, 16:22

Merci messieurs!
«Le matin, quand il t’en coûte de te réveiller, que cette pensée te soit présente: c’est pour faire œuvre d’homme que je m’éveille.»
Marc Aurèle.

Eléphant du PHP | 396 Messages

19 juin 2008, 16:35

Pour être complet et pour répondre à zeus,

http://dev.mysql.com/doc/refman/5.0/fr/delete.html

Code : Tout sélectionner

Le code .* après les noms de tables n'est présent que pour assurer la compatibilité avec Access : DELETE t1,t2 FROM t1,t2,t3 WHERE t1.id=t2.id AND t2.id=t3.id
.* n'est donc pas utile, je m'incline devant le grand zeus (voudrais pas me prendre un coup d'éclair non plus)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

20 juin 2008, 14:16

Modération :
albius, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.