Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes 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 15/09/2011, 18h57   #1
Nouveau Membre du Club
 
Inscription : septembre 2010
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 62
Points : 37
Points : 37
Par défaut Création de clé étrangère

Bonjour

J'ai peu l'habitude de faire des requêtes Mysql à la main, et là je dois dire que je bloque sur un truc assez simple à priori: la création d'une clé étrangère.

Mon cas est simple, j'ai une table "membres" avec un champs "categorie_id", et une table "categories" avec un champs Id. "categorie_id" et "id" de categorie ont tous les deux la même structure (int11)

Je voudrais mettre "categorie_id" en clé étrangère. Je précise que j'ai mis categorie_id en index, et que le champs "id" de la table categorie est en clé primaire.

voilà ma syntaxe:

Code :
1
2
3
4
5
6
7
 
ALTER TABLE membres 
ADD 'contrainte_categorie' 
FOREIGN KEY 'categorie_id'
REFERENCES categories ('id')
ON DELETE NO ACTION
ON UPDATE CASCADE
Le message d'erreur:

Citation:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''contrainte_categorie' FOREIGN KEY 'categorie_id' REFERENCES categories 'id' ' at line 2
zoreol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 09h54   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 327
Points : 18 327
Envoyer un message via MSN à CinePhil
Un coup d'oeil à la doc te donne la bonne syntaxe :
Citation:
ALTER [IGNORE] TABLE tbl_name
ADD [CONSTRAINT [symbol]]
FOREIGN KEY [index_name] (index_col_name,...)
[reference_definition]
Ce qui donne pour ton cas :
Code :
1
2
3
4
5
6
ALTER TABLE membres 
ADD CONSTRAINT 'contrainte_categorie' 
FOREIGN KEY 'categorie_id'
REFERENCES categories ('id')
ON DELETE NO ACTION
ON UPDATE CASCADE
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 16h57   #3
Nouveau Membre du Club
 
Inscription : septembre 2010
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 62
Points : 37
Points : 37
Merci de ton aide, pour commencer

J'ai bien regardé la doc, je pensais avoir compris que le "CONSTRAINT" de "ADD CONSTRAINT" était facultatif...

En tout cas même avec la requête que tu me proposes, j'ai le même message d'erreur...
zoreol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 18h03   #4
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
C'est les quotes qui sont faux. Par contre je ne comprends pas à quoi sert la clause ON UPDATE puisque la primary key associée est censée être immuable.
Par contre le ON DELETE CASCADE lui est très utile. Je la créerai plutôt comme ça :
Code :
1
2
3
4
5
ALTER TABLE membres 
ADD CONSTRAINT contrainte_categorie
FOREIGN KEY categorie_id
REFERENCES categories (id)
ON DELETE CASCADE
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 19h10   #5
Nouveau Membre du Club
 
Inscription : septembre 2010
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 62
Points : 37
Points : 37
Citation:
Envoyé par skuatamad Voir le message
C'est les quotes qui sont faux. Par contre je ne comprends pas à quoi sert la clause ON UPDATE puisque la primary key associée est censée être immuable.
Par contre le ON DELETE CASCADE lui est très utile. Je la créerai plutôt comme ça :
Code :
1
2
3
4
5
ALTER TABLE membres 
ADD CONSTRAINT contrainte_categorie
FOREIGN KEY categorie_id
REFERENCES categories (id)
ON DELETE CASCADE
merci ! ça signifie que si je supprime une catégorie, tous les membres issus de cette catégorie seront supprimés ? Je ne voudrais pas ça je pense. Sinon c'est vrai que le on update cascade était inutile

Enfin de toute façon le but était surtout de faire une clé étrangère, c'est pas pour un projet particulier.
zoreol est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/09/2011, 20h23   #6
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Citation:
Envoyé par zoreol Voir le message
merci ! ça signifie que si je supprime une catégorie, tous les membres issus de cette catégorie seront supprimés ?
Ah oui effectivement.
Mais un membre ne peut appartenir qu'à une catégorie ?
Le ON DELETE CASCADE a effectivement plus de sens dans le cas où on a :
1 table membre (id_membre,...)
1 table categorie (id_categorie,...)
1 table membre_categorie (id_membre, id_categorie) (relation (n,n) entre membre et categorie)
Dans ce cas un ON DELETE CASCADE sur les clés étrangères créées sur membre_categorie permet de purger la table d'association lorsqu'un membre ou une catégorie est supprimé.

Dans ton cas ce serait plutôt ON DELETE SET NULL (avec une colonne cateorie_id nullable)
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/09/2011, 11h57   #7
Nouveau Membre du Club
 
Inscription : septembre 2010
Messages : 62
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 62
Points : 37
Points : 37
Merci pour ton explication, c'est très clair
zoreol 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 00h43.


 
 
 
 
Partenaires

Hébergement Web