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

Langage SQL Discussion :

Ajouter une contrainte de clé étrangère


Sujet :

Langage SQL

  1. #1
    cedrix57
    Invité(e)
    Par défaut Ajouter une contrainte de clé étrangère
    Bonjour,

    Dans ma base de donnée j'ai un table Equipe, et une table Employe.
    Un employé appartient à une équipe.
    Une équipe a un employé chef.

    Voici le schéma relationnel de mes tables :
    Equipe(idEquipe, nomEquipe, idEmployeChef#)
    Employe(idEmployee, nomEmp, prenomEmp, idEquipe#)

    En SQL, il y a donc une contrainte de clé étrangère que je ne peux pas définir lors de la création des tables.

    J'ai essayé d'ajouter ma contrainte après la création des deux tables avec cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE Equipe ADD CONSTRAINT idEmployeChef FOREIGN KEY REFERENCES Employe(idEmploye);
    Mais j'obtiens cet erreur :
    ERROR: syntax error at or near "REFERENCES" at character 61


    Quelqu'un sait d'où viens le problème ?

    Merci d'avance

  2. #2
    Membre expert
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2005
    Messages
    1 473
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 473
    Points : 3 283
    Points
    3 283
    Par défaut
    Ne manquerait-il pas le nom de la colonne sur laquelle porte la clé étrangère ?

    Autre question :
    Comme les deux tables se référencent l'une vers l'autre, ne risque-t-on pas d'avoir un problème lors de l'INSERT ?

  3. #3
    cedrix57
    Invité(e)
    Par défaut
    En effet, la bonne synthaxe est ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE Equipe ADD CONSTRAINT idEmployeChef FOREIGN KEY (idEmployeChef) REFERENCES Employe(idEmploye);

    Sinon, je peux toujours faire des INSERT, en mettant des valeurs NULL avec mes clé étrangère, mais ce n'est effectivement pas pratique, car j'ai 3 opérations à faire.

    Merci de m'avoir répondu

    Cédric

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut L'oeuf et la poule
    Bonsoir Cédric,


    Citation Envoyé par cedrix57 Voir le message
    Dans ma base de donnée j'ai un table Equipe, et une table Employe.
    Un employé appartient à une équipe.
    Une équipe a un employé chef.

    Voici le schéma relationnel de mes tables :
    Equipe(idEquipe, nomEquipe, idEmployeChef#)
    Employe(idEmploye, nomEmp, prenomEmp, idEquipe#)
    Du point de vue de la théorie relationnelle, il n’y a aucun problème : si les deux tables se référencent mutuellement, on a deux INSERT dans un même bloc d’instructions et les contrôles ne sont déclenchés que lorsque l’ensemble des instructions du bloc a été effectué.

    Du point de vue SQL, c’est une autre paire de manches et Luc Orient vous l’a fait observer, disons que vous êtes confronté au problème de l'oeuf et de la poule. Maintenant, la norme SQL prévoit un paramètre Initially Deferred Deferrable utilisable pour la clause FOREIGN KEY, qui vous permet de déclencher par programme le contrôle de l’intégrité référentielle (instruction Set Constraints All Immediate), voire de le différer jusqu’au prochain point de COMMIT.

    Certains SGBD SQL offrent cette possibilité (par exemple Oracle, PostgreSQL). A défaut, vous pouvez mettre en œuvre une table supplémentaire, appelons-la Direction, qui soit un appendice de la table Equipe et soit connectée sur la table Employe :
    Equipe (idEquipe, nomEquipe)
    Employe (idEmploye, nomEmp, prenomEmp, idEquipe#)
    Direction (idEquipe#, idEmployeChef#)
    L’attribut idEmployeChef# disparaît de la table Equipe.
    La table Direction comporte une ligne par équipe. L’attribut idEquipe# en constitue la clé primaire et constitue aussi une clé étrangère référençant la table Equipe. L’attribut idEmployeChef# de la table Direction constitue la clé étrangère référençant la table Employe.

    A noter que si un employé ne peut diriger qu’une équipe, l’attribut idEmployeChef# de la table Direction devra faire l’objet d’une clé alternative (contrainte UNIQUE).

    En plus, si un employé ne peut diriger que l’équipe à laquelle il appartient, vous pourrez par exemple ajouter une surclé pour la table Employe :
    Constraint Cx UNIQUE (idEmploye, idEquipe#)
    Et définir une contrainte référentielle pour la table Direction :
    Constraint Cy FOREIGN KEY (idEmployeChef#, idEquipe#)
    A moins que vous ne préfériez mettre en œuvre un trigger, c’est vous qui voyez.

    Exemple (SQL Server) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    CREATE TABLE Equipe
    (
          idEquipe       CHAR(4)        NOT NULL
        , nomEquipe      VARCHAR(32)    NOT NULL
     , CONSTRAINT C1 PRIMARY KEY (idEquipe)
    ) ;
     
    CREATE TABLE Employe
    (
          idEmploye       CHAR(4)        NOT NULL
        , idEquipe        CHAR(4)        NOT NULL
        , nomEmp          VARCHAR(32)    NOT NULL
     , CONSTRAINT C2 PRIMARY KEY (idEmploye)
     , CONSTRAINT C3 UNIQUE (idEmploye, idEquipe)
     , CONSTRAINT C4 FOREIGN KEY (idEquipe) REFERENCES Equipe (idEquipe)
    ) ;
    CREATE TABLE Direction
    (
          idEquipe        CHAR(4)        NOT NULL
        , idEmploye       CHAR(4)        NOT NULL
     , CONSTRAINT C5 PRIMARY KEY (idEquipe)
     , CONSTRAINT C6 UNIQUE (idEmploye)
     , CONSTRAINT C7 FOREIGN KEY (idEquipe) REFERENCES Equipe (idEquipe)
     , CONSTRAINT C8 FOREIGN KEY (idEmploye, idEquipe) REFERENCES Employe (idEmploye, idEquipe)
    ) ;
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 29
    Dernier message: 25/11/2007, 16h08
  2. Ajouter une contrainte UNIQUE à une clé
    Par Linio dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/06/2007, 13h36
  3. Ajouter une contrainte NOT NULL à une colonne
    Par abdelghani_k dans le forum Firebird
    Réponses: 1
    Dernier message: 03/06/2007, 16h26
  4. commande pour ajouter une contrainte
    Par naazih dans le forum Langage SQL
    Réponses: 1
    Dernier message: 10/05/2006, 08h11
  5. Réponses: 5
    Dernier message: 28/04/2006, 11h55

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