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

Requêtes MySQL Discussion :

Création de clé étrangère


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 67
    Points
    67
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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:

    #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

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Un coup d'oeil à la doc te donne la bonne syntaxe :
    ALTER [IGNORE] TABLE tbl_name
    ADD [CONSTRAINT [symbol]]
    FOREIGN KEY [index_name] (index_col_name,...)
    [reference_definition]
    Ce qui donne pour ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 la suite Linux Mageïa !

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    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...

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ALTER TABLE membres 
    ADD CONSTRAINT contrainte_categorie
    FOREIGN KEY categorie_id
    REFERENCES categories (id)
    ON DELETE CASCADE

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    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)

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 69
    Points : 67
    Points
    67
    Par défaut
    Merci pour ton explication, c'est très clair

Discussions similaires

  1. Erreur lors de la création de clés étrangères
    Par Neuromancien2 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 02/07/2007, 23h44
  2. [HQL-DERBY] Création table,clé étrangère, etc.
    Par vain_mich dans le forum Hibernate
    Réponses: 5
    Dernier message: 22/06/2007, 15h30
  3. [Firebird] Création de clé étrangère - FOREIGN KEY
    Par Vincent BONNAL dans le forum SQL
    Réponses: 3
    Dernier message: 05/08/2005, 16h49
  4. création de clé étrangère impossible
    Par Kozher dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 05/08/2005, 10h38
  5. Réponses: 3
    Dernier message: 12/11/2003, 15h57

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