Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/08/2006, 00h37   #1
Invité de passage
 
Inscription : mai 2006
Messages : 10
Détails du profil
Informations forums :
Inscription : mai 2006
Messages : 10
Points : 3
Points : 3
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;
SirKus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 00h55   #2
Rédacteur
 
Avatar de Biglo
 
Inscription : juillet 2002
Messages : 537
Détails du profil
Informations personnelles :
Localisation : France, Moselle (Lorraine)

Informations forums :
Inscription : juillet 2002
Messages : 537
Points : 561
Points : 561
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 :
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 :
(`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 :
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;
Biglo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h04.


 
 
 
 
Partenaires

Hébergement Web