IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

Petit problème de suppression avec un requête


Sujet :

Requêtes MySQL

  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut Petit problème de suppression avec un requête
    Bonjour à tous,

    J'ai 3 tables (Municipalités, Stations, MunicipalitésStations).

    MunicipalitiesStations : Liste de municipalités (Table optionnelle pour résoudre mon problème)
    Stations : Liste de stations
    MunicipalitiesStations : Indique quelles stations appartienne à quelle municipalité

    J'aimerais supprimer toutes les stations appartemant à une municipalité mais en UNE seule requête.

    Voici la description des tables nécessaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    CREATE TABLE `municipalities` (
      `m_ID` int(11) NOT NULL auto_increment,
      `m_Name` varchar(100) character set latin1 NOT NULL default '',
      PRIMARY KEY  (`m_ID`),
      UNIQUE KEY `m_MunicipalityName_UNI` (`m_Name`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    CREATE TABLE `municipalitiesstations` (
      `ms_StationID` int(11) NOT NULL default '0',
      `ms_MunicipalityID` int(11) NOT NULL default '0',
      PRIMARY KEY  (`ms_StationID`),
      KEY `ms_EntityID_IDX` (`ms_MunicipalityID`),
      CONSTRAINT `municipalitiesstations_ibfk_1` FOREIGN KEY (`ms_StationID`) REFERENCES `stations` (`s_ID`),
      CONSTRAINT `municipalitiesstations_ibfk_2` FOREIGN KEY (`ms_MunicipalityID`) REFERENCES `municipalities` (`m_ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
    CREATE TABLE `stations` (
      `s_ID` int(11) NOT NULL auto_increment,
      `s_Name` varchar(100) character set latin1 NOT NULL default '',
    default '''Unknow''',
      PRIMARY KEY  (`s_ID`),
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    Moi jusqu'ici la seule requête que j'ai pu trouvé c'est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DELETE MunicipalitiesStations.*, Stations.*
    FROM Stations INNER JOIN MunicipalitiesStations ON s_ID = ms_StationID
    WHERE MunicipalitiesStations.ms_StationID IN
    (
      SELECT ms_StationID FROM MunicipalitiesStations WHERE ms_MunicipalityID = 9
    );
    Mais j'obtiens l'erreur MySQL suivante : 1093 (You can't specify target table 'MunicipalitiesStations' for update in FROM clause). Qui dit que je ne peux pas utiliser la même table en sous requête...

    Quelqu'un à une idée de comment pourrais-je procéder ?
    Merci

  2. #2
    Expert éminent
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 911
    Points : 6 032
    Points
    6 032
    Par défaut
    Je me pose la question de l'utilité de la table municipalitiesstations ?

    En effet, une simple FK de station sur municipalities permettrait de spécifier ON DELETE CASCADE, ce qui du coup simplifierait ton problème.

  3. #3
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Tu as bien raison pour la table "municipalitiesstations" sauf que pour le moment je ne peux me permettre de modifier la structure des tables, cela impliquerait trop de travail En fait, si une station aurait pu appartenir à plusieurs stations alors cette table SERAIT utile mais dans ce cas-ci, elle ne l'est pas.

    Bref, pour faire histoire courte, j'aimerais bien éviter le delete en CASCADE si c'est possible

    Merci

  4. #4
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    As tu essayé de faire un from MunicipalitiesStations AS alias1, MunicipalitiesStations AS alias2 en utilisant celle de l'alias1 pour le INNER JOIN et le alias2 pour la sous requete ?

    je pense que c'est possible non ?

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Citation Envoyé par pop_up Voir le message
    As tu essayé de faire un from MunicipalitiesStations AS alias1, MunicipalitiesStations AS alias2 en utilisant celle de l'alias1 pour le INNER JOIN et le alias2 pour la sous requete ?

    je pense que c'est possible non ?
    Hummm... j'en doute mais j'ai tout même essayé ta solution avec la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    DELETE MunicipalitiesStations.*, Stations.*
    FROM MunicipalitiesStations AS Alias1, MunicipalitiesStations AS Alias2, Stations INNER JOIN Alias1 ON s_ID = ms_StationID
    WHERE MunicipalitiesStations.ms_StationID IN
    (
      SELECT ms_StationID FROM Alias2 WHERE ms_MunicipalityID = 9
    );
    J'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Not unique table/alias: 'Alias1'

  6. #6
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    j'avais jamais essayer avec une sous requete mais avec un where classique ça passe . un exemple d'une requete ou j'ai fait un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT DISTINCT REP_TUTEUR.id_adresse, REP_TUTEUR.id_personne
    	FROM REP_PERSONNE as REP_TUTEUR,
    		REP_DEMANDEUR as REP_DEM_TUTEUR, 
    		REP_PERSONNE as REP_PERSONNE, 
    		REP_DEMANDEUR as REP_DEM_PERSONNE,
    		REP_DOSSIER
    	WHERE REP_TUTEUR.id_personne=REP_DEM_TUTEUR.id_tuteur 
    		AND REP_PERSONNE.id_personne=REP_DEM_PERSONNE.id_personne 
    		AND REP_DEM_PERSONNE.id_tuteur=REP_TUTEUR.id_personne
    		AND REP_PERSONNE.id_personne=REP_DOSSIER.id_demandeur;

  7. #7
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Oui je comprend mais ici ce n'est pas la même chose. Premièrement c'est un DELETE que la requête doit effectuée. Ensuite, le problème majeur est que je dois faire un WHERE avec la même requête sur laquelle je fais un DELETE. C'est écrit noir sur blanc que c'est un erreur de logique dans la doc de MySQL. Bref, comme je ne peux MODIFIER la structure de mes tables et que j'aimerais à tout prix éviter le delete en CASCADE, il me faut une autre solution (en une seule requête) pour supprimer toutes les stations faisant partie de la municipaité 9.

    Merci

  8. #8
    Membre éclairé Avatar de pop_up
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    877
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2006
    Messages : 877
    Points : 786
    Points
    786
    Par défaut
    c'est vrai, désolé j'ai mal lu.

    Sinon je te propose ceci :

    Faire un curseur avec ton SELECT ms_StationID FROM MunicipalitiesStations WHERE ms_MunicipalityID = 9

    et apres pour chaque resultat, faire ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DELETE MunicipalitiesStations.*, Stations.*
    FROM Stations INNER JOIN MunicipalitiesStations ON s_ID = ms_StationID
    WHERE MunicipalitiesStations.ms_StationID=ta_variable_de_curseur;
    qu'est ce que t'en dis ? (meme si je sais que les curseurs c'est pas forcement le top)

  9. #9
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Points : 233
    Points
    233
    Par défaut
    Mes requête sont fait par INJECTION via un site web réalisé en C#. Je ne pense pas pourvoir créer un CURSEUR via une requête par injection. À moins que je ne me trompe... ?

Discussions similaires

  1. [MySQL] problème de résultat avec une requête
    Par jexl dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/03/2006, 23h23
  2. [débutant]petit problème sur formulaire avec onglets
    Par Christophe93250 dans le forum Access
    Réponses: 2
    Dernier message: 06/01/2006, 10h46
  3. [SQL] Problème de résultat avec une requête
    Par raptorman dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 04/01/2006, 17h16
  4. Suppression avec sous-requête conditionnelle
    Par Magnus dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/10/2005, 10h39
  5. suppression avec sous requête conditionnelle
    Par melmel dans le forum Requêtes
    Réponses: 8
    Dernier message: 18/03/2004, 23h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo