Page 1 sur 1

Delete sur plusieurs tables...

Posté : 19 juin 2008, 14:47
par albius
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,

Posté : 19 juin 2008, 14:59
par zeus
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 :?

Posté : 19 juin 2008, 15:04
par Rei Itchido
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

Posté : 19 juin 2008, 15:17
par zeus
pourquoi table1.* ?

On écrit

Code : Tout sélectionner

DELETE FROM table WHERE condition
pas

Code : Tout sélectionner

DELETE * FROM table WHERE condition

Posté : 19 juin 2008, 15:21
par Rei Itchido
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.

Posté : 19 juin 2008, 15:23
par Rei Itchido
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.

re:

Posté : 19 juin 2008, 16:22
par albius
Merci messieurs!

Posté : 19 juin 2008, 16:35
par Rei Itchido
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)

Posté : 20 juin 2008, 14:16
par ouckileou
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.