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 :

Requête SQL insert dans table liaison


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2019
    Messages : 45
    Par défaut Requête SQL insert dans table liaison
    Bonjour,

    Je souhaiterai remplir une table de liaison club_lien avec deux colonnes : club_id et lien_id.

    Les données à récupérer pour remplir la table club_lien sont dans deux tables :
    - lien : avec les colonnes id, liens, created_at, club_id
    - club : avec les colonnes id et nom_club

    Pour la table de liaison, les deux colonnes sont des clés primaires avec une contrainte clé étrangère sur les colonnes id des deux tables (lien et club).

    Dans ma requête j'aimerai pouvoir remplir la table de liaison club_lien à partir des données que j'ai dans les tables lien et club.

    Voici la requete que j'ai faite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO club_lien(club_id, lien_id) SELECT c.id, l.id FROM liens_rennes l, club c"
    celle-ci ne fonctionne pas car cela met que j'ai un probleme de PRIMARY KEY 1-1.
    J'ai supprimé mes clés primaires sur mes deux colonnes de la table club_lien, cela fonctionne mais pas comme je voudrais. Je retrouve avec une boucle infini sur le couple club_id lien_id. Il répète en boucle tout ce que j'ai dans la table lien. Je comprends mieux le probleme de primary KEy du coup, mais je ne vois pas comment le régler.

    Pourriez-vous m'aider ?

    Merci

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 445
    Par défaut
    Bonjour,
    La clé primaire de ta table club_lien doit être composée des deux colonnes (club_id et lien_id).
    Si tu poses une contraint d'unicité sur chacune des colonnes, tu ne pourras avoir qu'une seule ligne pour chaque lien, et une seule ligne pour chaque club.
    Pour le remplissage (dont je ne comprends pas bien l'utilité, mais bon), si tu veux vraiment toutes les combinaisons possibles avec le contenu des deux tables, il faut faire un cross-join:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select T1.id,T2.id
    from table1 as T1
    cross join table2 as T2

    Tatayo.

  3. #3
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2019
    Messages : 45
    Par défaut
    Merci pour cette réponse. Je vais la tester.

    Pour ce qui concerne le remplissage, je ne sais pas comment remplir de façon automatique une table de liaison. Ce que j'aimerai faire c'est que lorsque j'ajoute un lien qui nécessairement lié à un club je me retrouve dans ma table de liaison avec les correspondances.

    Par exemple :

    J'ai club 1 et club 2

    Pour club 1 qui a l 'id 1 j'aoute un nouveau lien qui a l'id 34 dans ma table de liens. Dès lors, J'aimerais automatiquement créer un nouvel enregistrement dans ma table liaison, de type
    [club_id => 1, lien_id = 34 ] et ainsi suite pour chaque nouvel enregistrement de club et de lien.

  4. #4
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2019
    Messages : 45
    Par défaut
    J'ai essayé la requête mais je n'arrive pas à la faire fonctionner.

    Voici ce que je saisis comme requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "INSERT INTO club_lien(club_id, lien_id) SELECT c.id, l.id FROM liens as l CROSS JOIN club as c"
    Et voici le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '1-1' for key 'PRIMARY'

  5. #5
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 445
    Par défaut
    C'est bien ce qu'il me semblait.
    Avec ce genre de requête tu tentes de créer toutes les liaisons possibles entre tes deux tables.
    Si tu le fais à chaque ajouts d'un club, tu auras fatalement des doublons.
    Est-ce que tu peux nous montrer le schéma de test tables, car j'ai un gros doute sur la finalité de la table lien.

    Tatayo.

  6. #6
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2019
    Messages : 45
    Par défaut
    Je travaille avec Sequel Pro, et malheureusement je ne peux afficher le schéma des tables

    mais ça se présente comme ça

    club
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TABLE `club` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `club` varchar(255) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;


    liens

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE `liens` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `content` longtext COLLATE utf8mb4_unicode_ci,
      `created_at` datetime DEFAULT NULL,
      `club_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=498 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    club_lien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE `club_lien` (
      `club_id` int(10) unsigned NOT NULL,
      `lien_id` int(10) unsigned NOT NULL,
      PRIMARY KEY (`club_id`,`lien_id`),
      KEY `fk_lien` (`lien_id`),
      CONSTRAINT `fk_club` FOREIGN KEY (`club_id`) REFERENCES `club` (`id`) ON DELETE CASCADE,
      CONSTRAINT `fk_lien` FOREIGN KEY (`lien_id`) REFERENCES `liens` (`id`) ON DELETE CASCADE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

  7. #7
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 900
    Par défaut
    Salut TedTech.

    Vous avez fait un produit cartésien entre vos deux identifiants.
    Du coup, vous avez des doublons !

    Je ne comprends pas l'utilité de votre table association "lien-club". Pourquoi ?
    Vous avez crée dans la table "lien" une colonne "club_id" qui fait référence à la table "club".

    Citation Envoyé par Tatayo
    Je pensais à tord que la table Lien faisait justement le lien entre club…
    Pourquoi à tort ? Il existe une colonne qui fait ce lien : "club_id".
    Par contre, je ne comprends pas pourquoi n'a-t-elle pas été définie en tant que clef étrangère.

    Pour faire l'insertion, voici ce que je propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    insert ignore into `club-lien` (`club_id`,`lien_id`)
      select id, club_id from `lien`;
    @+

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 623
    Billets dans le blog
    10
    Par défaut
    Bonsoir,

    Nous avons deux réponses contradictoires, mais qui se tiennent :
    Citation Envoyé par tatayo Voir le message
    Je pensais à tord que la table Lien faisait justement le lien entre club…
    Citation Envoyé par Artemus24 Voir le message
    Pourquoi à tort ? Il existe une colonne qui fait ce lien : "club_id".
    Le truc, c'est qu'on a une table nommée "LIEN", on pense donc qu'elle est issue, au niveau conceptuel, d'une association entre deux types d'entité (elle fait le lien entre ces types d'entité), mais ce n'est peut être pas le cas...
    Que représente fonctionnellement cette table lien ?

    S'il s'agit, comme le suppose Tatayo, d'un lien entre clubs, alors le MCD correspondant est une relation reflexive entre les clubs, ce qui produit, au niveau MLD, une table associative avec deux identifiants de club (club liant, club lié)
    S'il s'agit, comme le suppose Artemus24 d'une table issue d'un type d'entité "LIEN", alors son existence est justifiée

    Sans explication fonctionnelle sur ce que c'est qu'un lien dans le contexte de Tedtech, impossible de trancher...

  9. #9
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2019
    Messages : 45
    Par défaut
    Bonjour,


    Effectivement vous avez raison ma table lien, d'un point de vue conceptuel, porte à confusion. Ma table lien répertorie des liens urls en relation avec des clubs qui sont dans la table club.

    Toutes mes excuses pour ce manque de clarté dans mes explications, j'espère que cet éclaircissement vous sera utile.

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 623
    Billets dans le blog
    10
    Par défaut
    D'accord, mais en ce cas

    Si les règles de gestion sont un CLUB peut avoir plusieurs URL (0,n ou 1,n) et qu'une URL peut correspondre à plusieurs clubs (0,n ou 1,n)
    alors la table CLUB_LIEN et justifiée, mais la colonne club_id n'a rien à faire dans la table LIEN

    Si les règles de gestion sont un club peut avoir plusieurs URL (0,n ou 1,n) et une URL correspond à un seul club (0,1 ou 1,1)
    alors la table CLUB_LIEN doit disparaître et la colonne club_id est justifiée dans la table LIEN, mais il manque la contrainte mentionnant que cette colonne fait référence à la table CLUB

    Enfin, si les règles de gestion sont un club a une seule URL (0,1 ou 1,1) et qu'une URL correspond à plusieurs clubs (0,n ou 1,n)
    alors la table CLUB_LIEN doit disparaître, la colonne club_id doit également disparaître dans la table LIEN et il faut ajouter une colonne lien_id dans la table CLUB avec une contrainte mentionnant que cette colonne fait référence à la table LIEN

  11. #11
    Membre averti
    Femme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2019
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2019
    Messages : 45
    Par défaut
    Top, merci beaucoup votre aide. Je viens de comprendre un truc en sql ^^
    La première hypothèse est la bonne

Discussions similaires

  1. [MySQL] Ajouter un champ dans une requête SQL Insert
    Par beegees dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/11/2008, 14h24
  2. [SQL] Problème de requête d'insertion dans une base SAGE
    Par Swapyyy dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 04/07/2008, 10h14
  3. Réponses: 4
    Dernier message: 10/04/2007, 11h10
  4. [SQL] Insertion dans plusieurs tables
    Par fadex dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 15/02/2007, 11h47
  5. Insertion dans table SQL server (Trigger) Aidz moi SVP????
    Par pop bob dans le forum Développement
    Réponses: 2
    Dernier message: 30/07/2005, 23h55

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