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 :

Insertion à partir d'une table associative


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Points : 68
    Points
    68
    Par défaut Insertion à partir d'une table associative
    Bonjour à tous,

    Dans le cadre de mon projet, j'ai une BDD actuelle utilisant une table associative entre deux tables Table1 et Table2 reprennant l'id de chacune d'elle.
    Je souhaiterai donc supprimer la table associative Table1_Table2 en rapportant l'Id de la Table2 directement dans la Table1.
    Mais l'existence de doublons dans la table Table1_Table2 m'empêche de faire un INSERT global du type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO Table1
    SELECT Table1.mes champs, Table2.id
    FROM Table1, TAble2
    WHERE Table1.id = Table1_Table2.id;
    La structure de la table Table1 ayant été au préalable changée.

    Merci d'avance pour votre éventuelle aide.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Je ne suis pas certain d'avoir bien compris ce que tu souhaites faire, mais pour éliminer d'éventuels doublons, tu peux utiliser le mot-clef DISTINCT au début du SELECT.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Points : 68
    Points
    68
    Par défaut
    Merci pour ta réponse, mais j'ai presque terminé mon labeur...
    Voici le code SQL concerné, sachant que j'ai un problème à l'heure actuelle en voulant supprimé la table affaire.

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
     
    -- Sauvegarde de la table affaire
    CREATE TABLE affaire2 AS SELECT * FROM affaire;
     
    -- Création de la table statut
    DROP TABLE IF EXISTS statut;
    CREATE TABLE  statut (
      `StatutId` int(11) NOT NULL AUTO_INCREMENT,
      `StatutNom` varchar(45) NOT NULL,
      PRIMARY KEY (`StatutId`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
     
    INSERT INTO statut VALUES (1, "En cours");
    INSERT INTO statut VALUES (2, "Gagnée");
    INSERT INTO statut VALUES (3, "Perdue");
    INSERT INTO statut VALUES (4, "Reportée");
    INSERT INTO statut VALUES (5, "No Go");
     
    -- Création de la table associative entre les affaires et les contacts
    DROP TABLE IF EXISTS affaire_contact;
    CREATE TABLE  affaire_contact (
      `AC_AffaireId` int(11) NOT NULL,
      `AC_ContactId` int(11) NOT NULL,
      PRIMARY KEY (`AC_AffaireId`,`AC_ContactId`),
      KEY `AC_ContactId_fkey` (`AC_ContactId`),
      CONSTRAINT `AC_AffaireId_fkey` FOREIGN KEY (`AC_AffaireId`) REFERENCES `affaire` (`AffaireId`),
      CONSTRAINT `AC_ContactId_fkey` FOREIGN KEY (`AC_ContactId`) REFERENCES `contact` (`ContactId`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- Suppression et création de la nouvelle table affaire.
    DROP TABLE IF EXISTS affaire;
    CREATE TABLE  affaire (
      `AffaireId` int(11) NOT NULL DEFAULT '0',
      `AffaireTypeAffaireId` int(11) NOT NULL,
      `AffaireNom` varchar(64) NOT NULL,
      `AffaireDateCreation` date DEFAULT NULL,
      `AffaireDateActualisation` date DEFAULT NULL,
      `AffaireDateFin` date DEFAULT NULL,
      `AffaireStatutId` int(11) DEFAULT 1,
      `AffaireCommentaire` text DEFAULT NULL,
      `AffaireSocieteId` int(11) NOT NULL,
      PRIMARY KEY (`AffaireId`),
      KEY `Affaire_TypeAffaire_fkey` (`AffaireTypeAffaireId`),
      KEY `Affaire_Statut_fkey` (`AffaireStatutId`),
      KEY `Affaire_Societe_fkey` (`AffaireSocieteId`),
      CONSTRAINT `Affaire_Societe_fkey` FOREIGN KEY (`AffaireSocieteId`) REFERENCES `societe` (`SocieteId`),
      CONSTRAINT `Affaire_Statut_fkey` FOREIGN KEY (`AffaireStatutId`) REFERENCES `statut` (`StatutId`),
      CONSTRAINT `Affaire_TypeAffaire_fkey` FOREIGN KEY (`AffaireTypeAffaireId`) REFERENCES `typeaffaire` (`TypeAffaireId`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- Vérification : on compte les affaires ayant plusieurs sociétés (optionnel pour le suivi).
    SELECT * FROM societe_affaire WHERE SA_AffaireId IN (SELECT SA_AffaireId FROM societe_affaire GROUP BY SA_AffaireId HAVING COUNT(SA_AffaireId)>1);
     
    -- Insertion des données dans la table Affaire sans les affaires affiliées à plusieurs sociétés.
    INSERT INTO affaire
    SELECT A2.AffaireId, A2.AffaireTypeAffaireId, A2.AffaireNom, A2.AffaireDateCreation, A2.AffaireDateActualisation, A2.AffaireDateFin, 1, "", SA_SocieteId  
    FROM societe_affaire SA, affaire A2 
    WHERE A2.AffaireId = SA_AffaireId GROUP BY SA_AffaireId;
     
    -- Activation de l'auto_increment sur la clé primaire de la table affaire pour l'insertion des doublons.
    ALTER TABLE affaire MODIFY COLUMN `AffaireId` INTEGER NOT NULL DEFAULT NULL AUTO_INCREMENT;
     
    -- Insertion des doublons non enregistrés auparavant, avec génération automatique de la clé primaire par l'auto_increment.
    INSERT INTO affaire (AffaireTypeAffaireId, AffaireNom, AffaireDateCreation, AffaireDateActualisation, AffaireDateFin, AffaireStatutId, AffaireCommentaire, AffaireSocieteId)
    SELECT A2.AffaireTypeAffaireId, A2.AffaireNom, A2.AffaireDateCreation, A2.AffaireDateActualisation, A2.AffaireDateFin, 1, "", SA.SA_SocieteId
    FROM societe_affaire SA, affaire2 A2
    WHERE SA_AffaireId IN (SELECT SA_AffaireId FROM societe_affaire GROUP BY SA_AffaireId HAVING COUNT(SA_AffaireId)>1)
    AND SA_SocieteId NOT IN (SELECT SA_SocieteId FROM societe_affaire GROUP BY SA_AffaireId HAVING COUNT(SA_AffaireId)>1)
    AND A2.AffaireId = SA_AffaireId
    GROUP BY SA_SocieteId;
     
    -- Désactivation de l'auto_increment sur la clé primaire de la table affaire pour l'insertion des doublons.
    ALTER TABLE affaire MODIFY COLUMN `AffaireId` INTEGER NOT NULL DEFAULT '0';
     
    -- Attribution des commerciaux aux nouvelles affaires récemment créées.
    INSERT INTO commercial_affaire
    SELECT CA.CA_CommercialId, A.AffaireId
    FROM commercial_affaire CA, affaire A
    WHERE CA.CA_AffaireId IN (SELECT SA_AffaireId FROM societe_affaire GROUP BY SA_AffaireId HAVING COUNT(SA_AffaireId)>1)
    AND A.AffaireId NOT IN (SELECT CA_AffaireId FROM commercial_affaire)
    GROUP BY A.AffaireId;
     
    -- Suppression de la table affaire2.
    DROP TABLE affaire2;
    Mon problème survient lors de la suppression de la table affaire pour la recréer à cause de contrainte d'intégrité.

    A bientôt

  4. #4
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Points : 68
    Points
    68
    Par défaut
    Bonjour à tous,

    Je suis en train d'abandonner l'idée de créer une copie de la table affaire pour en recréer une nouvelle avec mes modifications, pour modifier directement la table affaire originelle en y ajoutant les colonnes que je souhaitais...
    Mais je n'arrive pas à mettre les id des sociétés en voulant faire un update, je ne suis pas assez calé dans ce domaine...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE `affaire`
    SET `AffaireSocieteId` = (SELECT SA_SocieteId  
    FROM societe_affaire SA, affaire A
    WHERE A.AffaireId = SA_AffaireId)
    WHERE ?????;
    Quelqu'un aurait-il une idée?

    Merci.

  5. #5
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    On peut utiliser des jointures dans l'UPDATE sous MySQL (attention, cette syntaxe est propre à MySQL) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE affaire
    INNER JOIN societe_affaire ON affaire.AffaireId = societe_affaire.SA_AffaireId
    SET affaire.AffaireSocieteId` = societe_affaire.SA_SocieteId
    Enfin quelque chose comme ça.
    Bien sûr, si on avait le schéma de ta base (en tout cas des 2 tables) avec un petit exemple de ce que tu as dans chaque table et de ce que tu souhaites obtenir après l'UPDATE, ça serait plus facile pour t'aider efficacement .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  6. #6
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 115
    Points : 68
    Points
    68
    Par défaut
    Merci pour ta réponse, j'ai terminé hier mon script de modification de ma base de données.

    Je vous laisse le script, ça peut toujours aider

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    -- Création de la table statut et insertion des données.
    DROP TABLE IF EXISTS `statut`;
    CREATE TABLE  `statut` (
      `StatutId` int(11) NOT NULL AUTO_INCREMENT,
      `StatutNom` varchar(45) NOT NULL,
      PRIMARY KEY (`StatutId`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;
     
    -- Insertion des nouvelles natures.
    INSERT INTO statut VALUES (1, "En cours");
    INSERT INTO statut VALUES (2, "Gagnée");
    INSERT INTO statut VALUES (3, "Perdue");
    INSERT INTO statut VALUES (4, "Reportée");
    INSERT INTO statut VALUES (5, "No Go");
     
    -- Création de la table associative entre les affaires et les contacts
    DROP TABLE IF EXISTS `affaire_contact`;
    CREATE TABLE  `affaire_contact` (
      `AC_AffaireId` int(11) NOT NULL,
      `AC_ContactId` int(11) NOT NULL,
      PRIMARY KEY (`AC_AffaireId`,`AC_ContactId`),
      KEY `AC_ContactId_fkey` (`AC_ContactId`),
      CONSTRAINT `AC_AffaireId_fkey` FOREIGN KEY (`AC_AffaireId`) REFERENCES `affaire` (`AffaireId`),
      CONSTRAINT `AC_ContactId_fkey` FOREIGN KEY (`AC_ContactId`) REFERENCES `contact` (`ContactId`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    -- Modification de la table affaire : ajout des colonnes AffaireStatutId (valeur par défaut 1 : "En cours"), AffaireCommentaire et AffaireSocieteId.
    ALTER TABLE `affaire`
    	ADD COLUMN `AffaireStatutId` int(11) DEFAULT 1,
    	ADD COLUMN `AffaireCommentaire` text DEFAULT NULL,
    	ADD COLUMN `AffaireSocieteId` int(11) NOT NULL;
     
    -- Modification des affaires existantes en les liant avec leur société correspondante, uniquement pour les affaires affiliées à une société.	
    UPDATE affaire
    SET AffaireSocieteId = (SELECT SA.SA_SocieteId  
    								FROM societe_affaire SA
    								WHERE affaire.AffaireId = SA.SA_AffaireId
    								GROUP BY SA.SA_AffaireId);
     
    -- Vérification : on compte les affaires ayant plusieurs sociétés (optionnel pour le suivi).
    SELECT * FROM societe_affaire WHERE SA_AffaireId IN (SELECT SA_AffaireId 
    													 FROM societe_affaire 
    													 GROUP BY SA_AffaireId 
    													 HAVING COUNT(SA_AffaireId)>1);
     
    -- Activation de l'auto_increment sur la clé primaire de la table affaire pour l'insertion des doublons.
    ALTER TABLE `affaire` MODIFY COLUMN `AffaireId` INTEGER NOT NULL DEFAULT NULL AUTO_INCREMENT;
     
    -- Insertion des doublons non enregistrés auparavant, avec génération automatique de la clé primaire par l'auto_increment.
    INSERT INTO affaire (AffaireTypeAffaireId, AffaireNom, AffaireDateCreation, AffaireDateActualisation, AffaireDateFin, AffaireStatutId, AffaireCommentaire, AffaireSocieteId)
    SELECT A.AffaireTypeAffaireId, A.AffaireNom, A.AffaireDateCreation, A.AffaireDateActualisation, A.AffaireDateFin, 1, NULL, SA.SA_SocieteId
    FROM societe_affaire SA, affaire A
    WHERE SA_AffaireId IN (SELECT SA_AffaireId 
    					   FROM societe_affaire 
    					   GROUP BY SA_AffaireId 
    					   HAVING COUNT(SA_AffaireId)>1)
    AND SA_SocieteId NOT IN (SELECT SA_SocieteId 
    						 FROM societe_affaire 
    						 GROUP BY SA_AffaireId 
    						 HAVING COUNT(SA_AffaireId)>1)
    AND A.AffaireId = SA_AffaireId
    GROUP BY SA_SocieteId;
     
    -- Désactivation de l'auto_increment sur la clé primaire de la table affaire pour l'insertion des doublons.
    ALTER TABLE `affaire` MODIFY COLUMN `AffaireId` INTEGER NOT NULL DEFAULT '0';
     
    -- Attribution des commerciaux aux nouvelles affaires récemment créées.
    INSERT INTO commercial_affaire
    SELECT CA.CA_CommercialId, A.AffaireId
    FROM commercial_affaire CA, affaire A
    WHERE CA.CA_AffaireId IN (SELECT SA_AffaireId 
    					      FROM societe_affaire 
    						  GROUP BY SA_AffaireId 
    						  HAVING COUNT(SA_AffaireId)>1)
    AND A.AffaireId NOT IN (SELECT CA_AffaireId 
    						FROM commercial_affaire)
    GROUP BY A.AffaireId;
     
    -- Suppression de la table associative societe_affaire.
    DROP TABLE societe_affaire;

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

Discussions similaires

  1. Trigger avec Insertion à partir d'une autre table
    Par ALexSql dans le forum Développement
    Réponses: 1
    Dernier message: 15/03/2012, 22h41
  2. Réponses: 6
    Dernier message: 15/06/2010, 03h18
  3. insertion de valeurs dans un combobox a partir d'une table
    Par FstDsi dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 03/06/2008, 00h01
  4. Réponses: 1
    Dernier message: 23/01/2007, 15h57
  5. Recherche de donnee dans une table associée
    Par josoft dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/07/2003, 15h22

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