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 :

Comment définir une clé composée d'une clé composée


Sujet :

SQL Procédural MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 10
    Points : 13
    Points
    13
    Par défaut Comment définir une clé composée d'une clé composée
    Salut, voilà un descriptif de mon problème :

    soit une table A3 qui sert de relation N-N entre deux tables A1 et A2,
    soit une table B2 qui sert de relation N-N entre une table B1 et A3

    Donc :
    A3 possède une clé primaire composite A1+A2
    B2 possède une clé primaire composite B1+A3

    la question est : comment définir dans B2 qu'une partie de la clé primaire composite de B2 est elle-même composée d'une autre clé primaire composite (A3)? Le code de B2 ci-dessous ne fonctionne pas, qu'est-ce qui est faux?

    -------------------------Table A1-------------------------
    DROP TABLE IF EXISTS `A1`;
    CREATE TABLE `A1` (
    `IdA1` int(10) unsigned NOT NULL auto_increment,
    PRIMARY KEY (`IdA1`),
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    -------------------------Table A2-------------------------
    DROP TABLE IF EXISTS `A2`;
    CREATE TABLE `A2` (
    `IdA2` int(10) unsigned NOT NULL auto_increment,
    PRIMARY KEY (`IdA2`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    -------------------------Table A3-------------------------
    (pour relation N-N entre A1 et A2)
    ----------------------------------------------------------
    DROP TABLE IF EXISTS `A3`;
    CREATE TABLE `A3` (
    `IdA1` int(10) unsigned NOT NULL,
    `IdA2` int(10) unsigned NOT NULL,
    PRIMARY KEY (`IdA1`,`IdA2`),
    KEY `FK_A3_A1` (`IdA1`),
    KEY `FK_A3_A2` (`IdA2`),
    CONSTRAINT `FK_A3_A1` FOREIGN KEY (`IdA1`) REFERENCES `A1` (`IdA1`),
    CONSTRAINT `FK_A3_A2` FOREIGN KEY (`IdA2`) REFERENCES `A2` (`IdA2`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    -------------------------Table B1-------------------------
    DROP TABLE IF EXISTS `B1`;
    CREATE TABLE `B1` (
    `IdB1` int(10) unsigned NOT NULL auto_increment,
    PRIMARY KEY (`IdB1`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

    -------------------------Table B2-------------------------
    (pour relation N-N entre B1 et A3)
    ----------------------------------------------------------
    DROP TABLE IF EXISTS `B2`;
    CREATE TABLE `B2` (
    `IdB1` int(10) unsigned NOT NULL,
    `IdA3` int(10) unsigned NOT NULL,
    PRIMARY KEY (`IdB1`,`IdA3`),
    KEY `FK_B2_B1` (`IdB1`),
    KEY `FK_B2_A3` (`IdA3`),
    CONSTRAINT `FK_B2_B1` FOREIGN KEY (`IdB1`) REFERENCES `B1` (`IdB1`),
    CONSTRAINT `FK_B2_A3` FOREIGN KEY (`IdA3`) REFERENCES `A3` (`IdA1`,`IdA2`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

  2. #2
    Membre éprouvé
    Avatar de Biglo
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France, Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 537
    Points : 984
    Points
    984
    Par défaut
    Salut,

    Tout d'abord, petite remarque concernant tes index : tu en as qui sont complètement inutiles. Cela ne sert à rien de rajouter des index pour les colonnes qui sont déjà préfixes d'un autre index.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    PRIMARY KEY (`IdA1`,`IdA2`),
    KEY `FK_A3_A1` (`IdA1`) ==> ne sert à rien
    Ensuite, pense aux balises CODE la prochaine fois, c'est plus clair pour ceux qui lisent ton message

    Et enfin, c'est normal que cela ne fonctionne pas. Tu dis "1 entier fait référence à 2 entiers" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (`IdA3`) REFERENCES `A3` (`IdA1`,`IdA2`)
    Tu as deux solutions : soit tu introduits dans A3 un identifiant "artificiel" qui sera repris dans B2. Soit dans B2, tu stockes les deux parties de la clé de A3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DROP TABLE IF EXISTS `B2`;
    CREATE TABLE `B2` (
    `IdB1` int(10) unsigned NOT NULL,
    `IdA1A3` int(10) unsigned NOT NULL,
    `IdA2A3` int(10) unsigned NOT NULL,
    PRIMARY KEY (`IdB1`,`IdA1A3`, `IdA2A3`),
    KEY `FK_B2_A3` (`IdA1A3`, `IdA2A3`),
    CONSTRAINT `FK_B2_B1` FOREIGN KEY (`IdB1`) REFERENCES `B1` (`IdB1`),
    CONSTRAINT `FK_B2_A3` FOREIGN KEY (`IdA1A3`, `IdA2A3`) REFERENCES `A3` (`IdA1`,`IdA2`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Discussions similaires

  1. Comment définir le format texte d'une expression
    Par mat120784 dans le forum QlikView
    Réponses: 4
    Dernier message: 19/12/2011, 14h58
  2. [PHPExcel] Comment définir la largeur de toute une colonne ?
    Par flashphp dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 26/05/2009, 18h36
  3. [VB]accéder au composant d'une fenetre à partir d'une autre
    Par ennamsaoui dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 24/04/2006, 11h44
  4. Réponses: 11
    Dernier message: 06/12/2005, 08h23
  5. copie d'une table Y d'une base A vers une table X d'une base
    Par moneyboss dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/08/2005, 21h24

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