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

SQL Procédural MySQL Discussion :

You can't specify target table 'T_RESEAU' for update in FROM clause


Sujet :

SQL Procédural MySQL

  1. #1
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut You can't specify target table 'T_RESEAU' for update in FROM clause
    Bonjour!

    J'ai un table T_RESEAU qui liste des réseaux. Ces réseaux ont 3 champs: ID(pk), intitule, indice.

    Un réseau peut être monté de version, auquel cas, un réseau de même intitule et d'indice supérieur sera créé:
    Ex: FH-Paris d'indice 0 sera le père du FH-Paris d'indice 1

    Il y a dans la base de donnée une contrainte d'unicité sur le couple (nom, indice).

    Pour une raison d'évolution (intitule du fils changé par l'utilisateur = lien de paternité perdu) j'ai créé une relation père-fils entre les réseau: foreign key parent_id dans la table T_RESEAU par défaut nulle.

    J'aimerais maintenant mettre à jour cette colonne en insérant aux réseaux fils l'id de leur réseau père.

    J'ai écrit la fonction sql suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE T_RESEAU
    SET T_RESEAU.RES_PARENT = (SELECT T_RESEAU1.RES_ID_N FROM T_RESEAU T_RESEAU1 WHERE T_RESEAU1.RES_INDICE_N=0 AND T_RESEAU1.RES_INTITULE_C = T_RESEAU.RES_INTITULE_C)
    WHERE T_RESEAU.RES_INDICE_N=1
    (Je pensais mettre à jour les réseaux d'indice 1 avec les réseaux d'indice 0 ensuite les réseaux d'indice 2 avec les réseaux d'indice 1)

    Mais je rencontre une erreur sql! :
    You can't specify target table 'T_RESEAU' for update in FROM clause
    Qu'en pensez vous svp?!

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Quel est votre SGBD ?

    enfin vu l'erreur vous êtes partie pour passer par une table temporaire.

  3. #3
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut
    Merci de votre rapide réponse!

    C'est MySQL
    Je suis partie sur une procédure stockée:
    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
    24
    25
    26
     
    DELIMITER |
    CREATE PROCEDURE proc()
    BEGIN
      DECLARE done INT DEFAULT FALSE;
      DECLARE id INT;
      DECLARE intitule CHAR(50);
      DECLARE id_pere INT;
      DECLARE cur CURSOR FOR SELECT RES_ID_N, RES_INTITULE_C FROM T_RESEAU WHERE RES_INDICE_N=1;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
     
      OPEN cur;
     
      read_loop: LOOP
        FETCH cur INTO id, intitule;
        IF done THEN
          LEAVE read_loop;
        END IF;
     
        id_pere = SELECT RES_ID_N FROM T_RESEAU WHERE RES_INDICE_N=0 AND RES_INTITULE_C like intitule;
        UPDATE T_RESEAU SET RES_PARENT = id_pere WHERE RES_ID_N=id;
     
      END LOOP;
     
      CLOSE cur;
    END|
    Qu'en pensez vous?

    (je suis sur une erreur en ce moment: la ligne " id_pere = SELECT RES_ID_N FROM T_RESEAU WHERE RES_INDICE_N=0 AND RES_INTITULE_C like intitule;" ne fonctionne pas... ?)

  4. #4
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par Annsen Voir le message
    je suis sur une erreur en ce moment: la ligne " id_pere = SELECT RES_ID_N FROM T_RESEAU WHERE RES_INDICE_N=0 AND RES_INTITULE_C like intitule;" ne fonctionne pas... ?
    Bonjour,
    quand tu dis que ça ne fonctionne pas ça veut dire que tu as une erreur ou que tu n'as pas le résultat souhaité ?
    ~ Lola ~

  5. #5
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut
    C'est bien une erreur :
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '= SELECT RES_ID_N FROM T_RESEAU WHERE RES_INDICE_N=0 AND RES_INTITULE_C like int' at line 18
    J'ai l'impression que ce n'est pas la bonne manière de comparer une variable de type chaine de caractères...

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    pour la proc-stock, y a une section dédiez à ca dans la section MySql.

    sinon, sur MYSql vous ne pouvez pas faire un update sur une table si celle-ci est présente dans une sous-requête (lire la doc).

    Pour la solution avec une table temporaire (a adapter à MySql), si je ne me suis pas trompé dans les alias (je n'ai pas testé mais l'idée est là) =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create table t_reseau_tmp as (
    select a.RES_ID_N as parent, b.RES_ID_N as fils
    from t_reseau a
    inner join t_reseau b on a.RES_INTITULE_C = b.RES_INTITULE_C
    where a.RES_INDICE_N=0 and b.RES_INDICE_N=1);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    update T_RESEAU set T_RESEAU.RES_PARENT = (select parent from t_reseau_tmp b where t_reseau.RES_ID_N = b.fils)
    where exists (select 1 from t_reseau_tmp b where t_reseau.RES_ID_N = b.fils);
    Pour l'update il me semble que MySql possède une syntaxe avec jointure qui éviterai le EXISTS.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 41
    Points : 21
    Points
    21
    Par défaut
    C'est pas un problème de concurrence d'accès ?
    Genre tu essaies d'écrire dans des enregistrements alors que tu lis la table au même moment ?

  8. #8
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut
    Je vous remercie Punkoff!

    C'est la solution!
    Mais j'aimerais mener à bien cette procédure stockée afin de m'assurer de la compréhension du cours....
    Est ce que je peux bien passer par une procédure stockée pour réaliser cela? et si oui auriez vous, svp, une idée de ce qui ne convient pas dans la mienne :S?!

    Merci de votre aide!

  9. #9
    Membre régulier
    Femme Profil pro
    Analyste-developpeur java
    Inscrit en
    Mai 2010
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Analyste-developpeur java
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2010
    Messages : 135
    Points : 76
    Points
    76
    Par défaut
    Merci mcorgnet oui c'est surement la raison de l'erreur initiale.
    Comme en java... on ne peut pas modifier une boucle que l'on est en train de parcourir.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. 2 lock tables + 1 for update = mysql dans les choux
    Par rt15 dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/07/2012, 17h33
  2. Réponses: 2
    Dernier message: 26/04/2011, 10h58
  3. Can't specify target in FROM clause
    Par Linio dans le forum Requêtes
    Réponses: 5
    Dernier message: 10/12/2010, 16h00
  4. Réponses: 2
    Dernier message: 17/03/2008, 16h38
  5. Réponses: 3
    Dernier message: 07/03/2008, 15h31

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