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 :

INSERT "value" sous condition de l'existence de "value" dans une autre table


Sujet :

Requêtes MySQL

  1. #1
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut INSERT "value" sous condition de l'existence de "value" dans une autre table
    Bonjour,


    Je voudrais insérer des nouveaux enregistrements dans une table A si et seulement si certaines des valeurs à insérer existent de façon unique dans une table B.

    Ma base MySql est gérée par le moteur MyISAM. (je ne souhaite pas passer en InnoDb, pour cause de compétences trop légères et de scripts multiples déjà existants)
    Les deux tables (table_A et table_B) ont chacune une clé primaire auto-incrémentée.

    Le champ "champ_1" existe dans les deux tables. Il est appelé champ_1_B dans la table table_B.

    Je voudrais savoir si c'est réalisable directement par une requête MySQL de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO table_A (`id_tableA`, `champ_1`, `champ_2 `, `champ_3`)
    VALUES
    ('', 'valeur_1', 'valeur_2', 'valeur_3')
    IF EXISTS & UNIQUE valeur_2 IN table_B.champ_1_B
    Et si oui, quelle serait la syntaxe d'une telle requête ?
    (je veux dire une requête MySQL, car c'est effectivement réalisable avec plusieurs requêtes en php, par exemple)

    Merci d'avance

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par hornetbzz Voir le message
    Je voudrais insérer des nouveaux enregistrements dans une table A si et seulement si certaines des valeurs à insérer existent de façon unique dans une table B.
    Décomposons le problème...
    1) Quelles sont les valeurs de champ_1_b n'existant qu'une seule fois dans la table_B ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT champ_1_B
    FROM table_B
    GROUP BY champ_1_B
    HAVING COUNT(*) = 1
    2) On insère les lignes de table_B correspondant à ces valeurs uniques dans table_A :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    INSERT INTO table_A (champ_1, champ_2, champ_3)
    SELECT b.champ_1_B, b.champ_2, b.champ_3
    FROM table_B AS b
    INNER JOIN (
      SELECT champ_1_B
      FROM table_B
      GROUP BY champ_1_B
      HAVING COUNT(*) = 1
    ) AS t ON t.champ_1_b = b.champ_1_b
    REMARQUES :
    1) Une table est composée de colonnes, pas de champs !

    2) Puisque l'identifiant est auto-incrémenté, inutile de le mettre dans la requête INSERT, encore moins en essayant de lui affecter une chaîne vide !

    3) Les apostrophes inversées autour des noms de colonnes sont inutiles si ce nom ne comporte pas d'espace, de caractères accentués ou pouvant être interprété comme des mots du langage SQL (ne jamais nommer une colonne 'Date' par exemple).

  3. #3
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Merci pour les commentaires, je vais essayer de les "digérer"

  4. #4
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Re bonjour,

    Je vais paraphraser ta suggestion pour être sûr d'avoir bien compris :

    1) On sélectionne toutes les valeurs uniques de la colonne "champ_B" (désolé, j'ai employé le terme "champ" à cause de mon côté anglo-saxon : "field")

    2) On sélectionne les valeurs des colonnes 'champ_1', 'champ_2', champ_3' de table_B à condition que la valeur de champ_1_B soit unique, et on injecte/insère ce résultat dans table_A.

    Si j'ai bien compris, j'ai peur que cela ne corresponde pas à ce que je veux faire.

    Je vais essayer de mieux expliquer ma pseudo-requête :

    table_A: Je veux ajouter un nouvel enregistrement avec 3 valeurs 'valeur_1', 'valeur_2', 'valeur_3', à insérer dans les 3 colonnes 'champ_1', champ_2', champ_3', à condition que : la valeur 'valeur_2' soit bien présente et unique dans "table_B".

    Je ne ne veux pas copier toutes les valeurs de "table_B.champ_2" dans "table_A", mais seulement enregistrer 3 valeurs dans "table_A" sous la condition que l'une des 3 valeurs à enregistrer (valeur_2) figure bien de manière singulière dans "table_B".

    Ou alors je n'ai pas compris le point "2", également fort probable

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    peut être un petit complément à la solution précédente

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    INSERT INTO table_A (champ_1, champ_2, champ_3)
    SELECT b.champ_1_B, b.champ_2, b.champ_3
    FROM table_B AS b
    INNER JOIN (
      SELECT champ_1_B
      FROM table_B
      GROUP BY champ_1_B
      HAVING COUNT(*) = 1
    ) AS t ON t.champ_1_b = b.champ_1_b
    avec l'ajout d'une condition sur la valeur de la colonne champ_1_b
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    INSERT INTO table_A (champ_1, champ_2, champ_3)
    SELECT b.champ_1_B, b.champ_2, b.champ_3
    FROM table_B AS b
    INNER JOIN (
      SELECT champ_1_B
      FROM table_B
      Where table_B.champ_1_B=valeur  
     GROUP BY champ_1_B
      HAVING COUNT(*) = 1
    ) AS t ON t.champ_1_b = b.champ_1_b

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par hornetbzz Voir le message
    table_A: Je veux ajouter un nouvel enregistrement avec 3 valeurs 'valeur_1', 'valeur_2', 'valeur_3', à insérer dans les 3 colonnes 'champ_1', champ_2', champ_3', à condition que : la valeur 'valeur_2' soit bien présente et unique dans "table_B".
    Effectivement, ce n'est pas ce que j'avais compris.

    Essaie comme ça alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    INSERT INTO table_A (champ_1, champ_2, champ_3)
    SELECT 'valeur_1', champ_1_B, 'valeur_3'
    FROM table_B AS b
    INNER JOIN (
      SELECT champ_1_B
      FROM table_B
      WHERE champ_1_B = 'valeur_2'
      GROUP BY champ_1_B
      HAVING COUNT(*) = 1
    ) AS t ON t.champ_1_b = b.champ_1_b
    Il n'y a même peut-être pas besoin de le faire avec une sous requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO table_A (champ_1, champ_2, champ_3)
    SELECT 'valeur_1', champ_1_B, 'valeur_3'
    FROM table_B
    WHERE champ_1_B = 'valeur_2'
    GROUP BY champ_1_B
    HAVING COUNT(*) = 1

  7. #7
    Membre éclairé
    Avatar de hornetbzz
    Homme Profil pro
    Directeur commercial
    Inscrit en
    Octobre 2009
    Messages
    482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : Directeur commercial

    Informations forums :
    Inscription : Octobre 2009
    Messages : 482
    Points : 773
    Points
    773
    Par défaut
    Merci encore pour tes indications,

    Je vais partir sur cette base et faire des essais en ce sens afin d'éviter des lignes de code en php (qui existent), et repartir sur une base saine en PDO avec des requêtes préparées (dignes de ce nom).

    Mais encore fallait-il savoir écrire correctement cette requête en MySql, donc merci encore, car c'était le point d'achoppement.

Discussions similaires

  1. Enregistrer contenu d'une table dans une autre table SOUS CONDITION
    Par Nanadoo dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 18/07/2014, 07h09
  2. [MySQL] Insertion données d'une table dans une autre table
    Par kikoyo dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 05/04/2009, 15h16
  3. insertion dans une table puis update dans une autre table
    Par uptoditime dans le forum VBA Access
    Réponses: 5
    Dernier message: 10/10/2007, 18h08
  4. Réponses: 2
    Dernier message: 05/06/2006, 14h24
  5. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13

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