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 06/10/2003, 12h04   #1
Invité de passage
 
Inscription : septembre 2003
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 9
Points : 3
Points : 3
Par défaut Plusieurs clés Etrangères ?

salut !

Est il possible de créer plusieurs clés étrangères dans une table?
J'ai une table fille avec 2 champs en UNIQUE KEY et 2 table mere.
Je peux créer une clés etrangeres mais pas 2. ET si je vire l'UNIQUE KEY je ne peux plus rien créer du tout.
Comment puis-je faire??

Merci d'avance.
maahta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 12h38   #2
Membre habitué
 
Inscription : février 2003
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 109
Points : 103
Points : 103
Envoyer un message via MSN à buffyann
bien sur qu'il est possible d'voir plusieurs clé etrangères dans une même table...
ensuite, je ne comprends pas trop ton problème.
donne nous ton instruction CREATE TABLE et ce qui pose problème et on t'aidera au mieux
buffyann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 13h10   #3
Invité de passage
 
Inscription : septembre 2003
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 9
Points : 3
Points : 3
salut

Vola pour le creation des 3 tables
Code :
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
 
DROP TABLE IF EXISTS Nom_Table_Fille;
CREATE TABLE IF NOT EXISTS Nom_Table_Fille
	(
	Champ1 VARCHAR(20) NOT NULL,
	Champ2 INT NOT NULL,
	Champ3 SMALLINT NOT NULL DEFAULT '0',
		UNIQUE KEY (Champ1,Champ2)
	) TYPE=INNODB;
 
DROP TABLE IF EXISTS Nom_Table_Mere1;
CREATE TABLE IF NOT EXISTS Nom_Table_Mere1
	(
	Champ1 VARCHAR(20) NOT NULL,
	Champ2 VARCHAR(1) NOT NULL DEFAULT 'S',
	Champ3 VARCHAR(30) NOT NULL,
	Champ4 VARCHAR(10) NOT NULL,
	Champ5 VARCHAR(50) DEFAULT '0',
	Champ6 VARCHAR(1) NOT NULL DEFAULT 'D',
	Champ7 TINYINT NOT NULL DEFAULT '1',
		PRIMARY KEY (Champ1),
		UNIQUE (Champ3)
	) TYPE=INNODB;
 
DROP TABLE IF EXISTS Nom_Table_Mere2;
CREATE TABLE IF NOT EXISTS Nom_Table_Mere2
	(
	Champ1 INT NOT NULL,
	Champ2 VARCHAR(30) NOT NULL,
	Champ3 VARCHAR(30) NOT NULL,
		PRIMARY KEY (Champ1),
		UNIQUE KEY (Champ2,Champ3)
	) TYPE=INNODB;
Et voila por la creation des 2 relation
Code :
1
2
3
4
 
ALTER TABLE Nom_Table_Fille 
	ADD FOREIGN KEY (Champ1) REFERENCES Nom_Table_Mere1 (Champ1),
	ADD FOREIGN KEY (Champ2) REFERENCES Nom_Table_Mere2 (Champ1);
la premiere relation marche mais pas la deuxieme non
Resultat :
Code :
1
2
 
[root@localhost:3306] ERREUR 1005: Can't create table '.\test\#sql-ffe26349_22.frm' (errno: 150)
maahta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 15h06   #4
Membre habitué
 
Inscription : février 2003
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 109
Points : 103
Points : 103
Envoyer un message via MSN à buffyann
pourquoi ne cree tu pas directement les clés etrangères dans ton create...

si tu tiens à faire comme ça, une remarque tout de même :

tu ne peux pas creer des champs, puis en creer du même nom en tant que clés etrangère...

il vaut mieux que tu fasse :
Code :
1
2
3
4
5
6
DROP TABLE IF EXISTS Nom_Table_Fille; 
CREATE TABLE IF NOT EXISTS Nom_Table_Fille 
   ( 
   Champ3 SMALLINT NOT NULL DEFAULT '0', 
      UNIQUE KEY (Champ1,Champ2) 
   ) TYPE=INNODB;
puis ensuite

Code :
1
2
3
ALTER TABLE Nom_Table_Fille 
   ADD FOREIGN KEY (Champ1) REFERENCES Nom_Table_Mere1 (Champ1), 
   ADD FOREIGN KEY (Champ2) REFERENCES Nom_Table_Mere2 (Champ1);
j'espere que ça va t'aider...
buffyann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 15h24   #5
Invité de passage
 
Inscription : septembre 2003
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 9
Points : 3
Points : 3
j'ai essayé de créer les cles etrangeres directement dans la table mais le probleme est qu'il ne crée meme pas la table.(dur pour comprendre ce qu'il ce passe).
A moins que la syntaxe ne soit pas bonne
Exemple:
Comme ca, ca marche pas
Code :
1
2
3
4
5
6
7
8
9
10
11
 
DROP TABLE IF EXISTS Nom_Table_Fille;
CREATE TABLE IF NOT EXISTS Nom_Table_Fille 
	(
	Champ1 VARCHAR(20) NOT NULL,
	Champ2 INT NOT NULL,
	Champ3 SMALLINT NOT NULL DEFAULT '0',
		UNIQUE (Champ1,Champ2),
		FOREIGN KEY (Champ1) REFERENCES Nom_Table_Mere1 (Champ1),
		FOREIGN KEY (Champ2) REFERENCES Nom_Table_Mere2 (Champ1)
                 ) TYPE=INNODB;
Comme ca, ca marche.
Code :
1
2
3
4
5
6
7
8
9
10
 
DROP TABLE IF EXISTS Nom_Table_Fille;
CREATE TABLE IF NOT EXISTS Nom_Table_Fille 
	(
	Champ1 VARCHAR(20) NOT NULL,
	Champ2 INT NOT NULL,
	Champ3 SMALLINT NOT NULL DEFAULT '0',
		UNIQUE (Champ1,Champ2),
		FOREIGN KEY (Champ1) REFERENCES Nom_Table_Mere1 (Champ1)
                 ) TYPE=INNODB;
et comme ca, ca marche pas non plus
Code :
1
2
3
4
5
6
7
8
9
10
 
DROP TABLE IF EXISTS Nom_Table_Fille;
CREATE TABLE IF NOT EXISTS Nom_Table_Fille 
	(
	Champ1 VARCHAR(20) NOT NULL,
	Champ2 INT NOT NULL,
	Champ3 SMALLINT NOT NULL DEFAULT '0',
		UNIQUE (Champ1,Champ2),
		FOREIGN KEY (Champ2) REFERENCES Nom_Table_Mere2 (Champ1)
                 ) TYPE=INNODB;
comprend pas ce qui se passe....
si tu peux me donner la bonne syntaxe ce serais cool.

De plus, pour l'autre facon de faire, il me faut absolument les 3 champs dans la table fille.
Donc si je comprend bien ce que tu me dis, "ALTER TABLE" peut me servir pour créer les champs 1 et 2, si oui comment indiquer les types de valeur, les NULL et valeur par default...
maahta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 15h27   #6
Membre habitué
 
Inscription : février 2003
Messages : 109
Détails du profil
Informations forums :
Inscription : février 2003
Messages : 109
Points : 103
Points : 103
Envoyer un message via MSN à buffyann
que te met mysql comme erreur déjà ?

je pensais que l'erreur venait peut être d'un conflit entre creation du champ et creation de la clé etrangère mais visiblement, ce que je dis, c'est n'importe quoi.
bon, je vais regarder un peu la doc pour la syntaxe l'histoire de ne pas te dire de betises.
[edit]
Bon,déjà, tu n'as oublié le mot clé CONSTRAINT devant foreign key...
j'ai aussi toruvé un sujet qui pourrait t'interesser :
http://www.developpez.net/forums/viewtopic.php?t=99177&highlight=create+table
[/edit]
buffyann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 16h06   #7
Invité de passage
 
Inscription : septembre 2003
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 9
Points : 3
Points : 3
l'erreur est
Code :
1
2
 
[root@localhost:3306] ERREUR 1005: Can't create table '.\test\u_lnk.frm' (errno: 150)
j'ai essayé avec "CONSTRAINT", rien a faire marche pas.

Un doute me viens a l'esprit :
Faut il créer une relation Foreign Key dans la la table Fille ou dans la Mere?
maahta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 16h19   #8
Membre confirmé
 
Avatar de omiossec
 
Inscription : juin 2002
Messages : 219
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2002
Messages : 219
Points : 240
Points : 240
Envoyer un message via AIM à omiossec Envoyer un message via Skype™ à omiossec
Essaye d'utilsé deux index au lieu d'un dans ta table fille et Nom_Table_Mere2

Code :
1
2
3
4
UNIQUE KEY (champ1),
UNIQUE KEY (champ2),
 au lieu de 
UNIQUE KEY (Champ1,Champ2)
__________________
Olivier Miossec
omiossec est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 17h07   #9
Invité de passage
 
Inscription : septembre 2003
Messages : 9
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 9
Points : 3
Points : 3
cela marche mais je ne peux pas avoir les 2 champs unique(concaténé)

exemple de donnée sur les deux champs:
0,1
0,2
1,1
2,1
2,3
etc
maahta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/10/2003, 20h22   #10
Membre confirmé
 
Avatar de omiossec
 
Inscription : juin 2002
Messages : 219
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : juin 2002
Messages : 219
Points : 240
Points : 240
Envoyer un message via AIM à omiossec Envoyer un message via Skype™ à omiossec
Dans ce cas la il faut créer un Troisième index unique
En fait Mysql à besoin des index pour gerer les contrainte avoir le même colones dans un index genere des conflit
__________________
Olivier Miossec
omiossec est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h50.


 
 
 
 
Partenaires

Hébergement Web