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 03/04/2006, 18h04   #1
Membre éprouvé
 
Enseignant
Inscription : avril 2004
Messages : 430
Détails du profil
Informations personnelles :
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : avril 2004
Messages : 430
Points : 438
Points : 438
Par défaut Problème clé étrangère

Bonjour,

Je souhaite créer une base toute simple avec mysql (avec EasyPHP 2.6.1)...

Voilà ce que je fais :

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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
 
-- Table Immeuble
 
CREATE TABLE Immeuble
(
 nomImm VARCHAR(15) NOT NULL,
 adresse VARCHAR(50) NOT NULL,
 nbEtages TINYINT,
 anneeConstruction SMALLINT, 
 nomGerant VARCHAR(15) NOT NULL,
 PRIMARY KEY(nomImm)
)ENGINE=InnoDB;
 
-- Table Appart
 
CREATE TABLE Appart
(
 nomImm VARCHAR(15) NOT NULL,
 noApp TINYINT NOT NULL,
 superficie SMALLINT,
 etage TINYINT,
 PRIMARY KEY (nomImm, noApp),
 FOREIGN KEY (nomImm) REFERENCES Immeuble( nomImm ) ON DELETE CASCADE
)ENGINE=InnoDB;
 
 
-- Table Personne
 
CREATE TABLE Personne
(
 nom VARCHAR(15) NOT NULL,
 age TINYINT,
 profession VARCHAR(15) NOT NULL,
 PRIMARY KEY (nom)
)ENGINE=InnoDB;
 
 
-- Table Occupant
 
CREATE TABLE Occupant
(
 nomImm VARCHAR(15) NOT NULL,
 noApp TINYINT NOT NULL,
 nomOcc VARCHAR(15) NOT NULL, 
 anneeArrivee SMALLINT,
 
 PRIMARY KEY (nomImm, noApp, nomOcc), 
 
 FOREIGN KEY (nomImm) REFERENCES Immeuble( nomImm ) ON DELETE CASCADE,
 FOREIGN KEY (nomOcc) REFERENCES Personne( nom ) ON DELETE CASCADE,
 FOREIGN KEY (noApp) REFERENCES Appart( noApp ) ON DELETE CASCADE
)ENGINE=InnoDB;
Tout marche, sauf la dernière ligne :
Code :
FOREIGN KEY (noApp) REFERENCES Appart( noApp ) ON DELETE CASCADE
J'ai beau la mettre avant, après rien n'y fait !!
Les 2 autres lignes précédentes fonctionnent, mais celle-ci non !!!
L'erreur retournée est
Citation:
MySQL a répondu:
#1005 - Ne peut cr�er la table '.\dbimmeubles\occupant.frm' (Errcode: 150)
Je comprends vraiment pas pourquoi !!!


En fait j'ai l'impression que mysql ne reconnait pas la table Appart car si je mets
Code :
FOREIGN KEY (noApp) REFERENCES Appart( bidule ) ON DELETE CASCADE
ça me renvoie la même erreur !!

Help !
__________________
"Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois
mathieu_t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 18h25   #2
Membre actif
 
Inscription : septembre 2005
Messages : 183
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 183
Points : 175
Points : 175
Envoyer un message via Yahoo à polace
Slt , qu'est ce qui se passe lorsque tu supprimes cette ligne
Code :
 FOREIGN KEY (noApp) REFERENCES Appart( noApp ) ON DELETE CASCADE
?
__________________
la succession d'évènement que nous subissons toute notre vie n'est qu'un phénomène de compensation dont la nature en est l'arbitre.[Inéluctabilité de la nature ] Polace
polace est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 21h07   #3
Membre éprouvé
 
Enseignant
Inscription : avril 2004
Messages : 430
Détails du profil
Informations personnelles :
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : avril 2004
Messages : 430
Points : 438
Points : 438
Salut !!

Eh bah ça marche justement !
Mais ça m'embête car je voudrais bien mettre la contrainte de clé étrangère quand même !!
__________________
"Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois
mathieu_t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/04/2006, 22h53   #4
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Citation:
Envoyé par Aide MySQL
Les deux tables doivent être de type InnoDB, dans la table, il doit y avoir un INDEX où les clés étrangères sont listées comme première colonne, dans le même ordre, et dans la table référencée, il doit y avoir un INDEX où les colonnes référencées sont listées comme premières colonnes, dans le même ordre...

InnoDB ne crée pas automatiquement les index nécessaires pour les clés étrangères : vous devez ls créer vous-même

Les index en question sont-ils crées ?

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TABLE product (category INT NOT NULL, id INT NOT NULL,
                      price DECIMAL,
                      PRIMARY KEY(category, id)) TYPE=INNODB;
CREATE TABLE customer (id INT NOT NULL,
                      PRIMARY KEY (id)) TYPE=INNODB;
CREATE TABLE product_order (no INT NOT NULL AUTO_INCREMENT,
                      product_category INT NOT NULL,
                      product_id INT NOT NULL,
                      customer_id INT NOT NULL,
                      PRIMARY KEY(no),
                      INDEX (product_category, product_id),             <<<<---- ici
                      FOREIGN KEY (product_category, product_id)
                        REFERENCES product(category, id)
                        ON UPDATE CASCADE ON DELETE RESTRICT,
                      INDEX (customer_id),                              <<<<---- et ici   
                      FOREIGN KEY (customer_id)
                        REFERENCES customer(id)) TYPE=INNODB;
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2006, 16h47   #5
Membre éprouvé
 
Enseignant
Inscription : avril 2004
Messages : 430
Détails du profil
Informations personnelles :
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : avril 2004
Messages : 430
Points : 438
Points : 438
Non !!
Je teste ça ce soir...

Mais pourquoi ça marche sur les autres clés étrangères où je n'ai pas fait d'index, et pas sur cette clé venant de "Appart" ?? C'est ça que je ne comprends pas bien...
__________________
"Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois
mathieu_t est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2006, 19h49   #6
Expert Confirmé Sénior
 
Avatar de qi130
 
Homme Pierre
Ingénieur qualité méthodes
Inscription : mars 2003
Messages : 3 726
Détails du profil
Informations personnelles :
Nom : Homme Pierre
Âge : 51
Localisation : France

Informations professionnelles :
Activité : Ingénieur qualité méthodes
Secteur : Finance

Informations forums :
Inscription : mars 2003
Messages : 3 726
Points : 4 739
Points : 4 739
Citation:
Mais pourquoi ça marche sur les autres clés étrangères où je n'ai pas fait d'index
Il me semble que, quand on déclare une Primary Key, MySQL créé automatiquement l'index corespondant...

Or, dans ton cas NoAppart n'est pas une PK

Quand à l'index résultant de
Code :
PRIMARY KEY (nomImm, noApp),
il ne peut convenir car
Citation:
Envoyé par Aide MySQL
il doit y avoir un INDEX où les clés étrangères sont listées comme première colonne,
hélas, noAppart est en 2nd 8)
__________________
"Il n'y a pas de bonnes réponses à une mauvaise question." (M. Godet)
-----------------------
Pensez à cloturer votre sujet - Aucune réponse aux sollicitations techniques par MP
Usus magister est optimus
qi130 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/04/2006, 23h04   #7
Membre éprouvé
 
Enseignant
Inscription : avril 2004
Messages : 430
Détails du profil
Informations personnelles :
Localisation : France, Puy de Dôme (Auvergne)

Informations professionnelles :
Activité : Enseignant

Informations forums :
Inscription : avril 2004
Messages : 430
Points : 438
Points : 438
ça marche !!


Et oui j'ai compris !

Merci pour l'explication !!

A+
__________________
"Cultiver les sciences et ne pas aimer les hommes, c'est allumer un flambeau et fermer les yeux." Proverbe chinois
mathieu_t 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 14h57.


 
 
 
 
Partenaires

Hébergement Web