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

Oracle Discussion :

Intégrité réferentielle sur clé primaire composée


Sujet :

Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Par défaut Intégrité réferentielle sur clé primaire composée
    Bonjour,

    J'ai une table T_TRADUCTION qui a une clé primaire composée d'un ID unique et de deux clé étrangère (la langue et le client auquel appartient la traduction).

    J'ai ensuite une table T_RUBRIQUE qui elle à une clé étrangère sur une traduction, mon problème est que je ne peux pas activé l'intégrité réferentielle sur un seul champ de le clé primaire.

    J'aimerais en fait pouvoir référencé uniquement l'id de la traduction dans ma rubrique afin de n'avoir qu'un occurence de rubrique pour chaque langue traduite et chaque client.

    Voici le script de création des 2 tables :

    Code : 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
     
    create table T_TRADUCTION  (
       TRAD_ID              INTEGER                         not null,
       TRAD_ID_CLIE         INTEGER                        default 1 not null,
       TRAD_ID_LANG         INTEGER                         not null,
       TRAD_DESC            VARCHAR2(2000)                  not null,
       TRAD_ENABLE          NUMBER(1)                      default 1 not null,
       constraint PK_T_TRADUCTION primary key (TRAD_ID_CLIE, TRAD_ID_LANG, TRAD_ID)
    );
     
    create table T_RUBRIQUE  (
       RUBR_ID              INTEGER                         not null,
       RUBR_ID_TRAD         INTEGER                         not null,
       RUBR_ID_PAGE         INTEGER                         not null,
       RUBR_ID_PERE         INTEGER,
       RUBR_REP             VARCHAR2(255)                   not null,
       RUBR_ORDER           INTEGER                         not null,
       RUBR_ENABLE          NUMBER(1)                      default 1 not null,
       constraint PK_T_RUBRIQUE primary key (RUBR_ID)
    );
    Et j'aimerais activé la contrainte comme ceci par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table T_RUBRIQUE
       add constraint FK_T_RUBRIQ_FK_RUBR_T_T_TRADUC foreign key (RUBR_ID_TRAD)
          references T_TRADUCTION (TRAD_ID);

  2. #2
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut Re: Intégrité réferentielle sur clé primaire composée
    Citation Envoyé par dadg
    J'ai une table T_TRADUCTION qui a une clé primaire composée d'un ID unique et de deux clé étrangère (la langue et le client auquel appartient la traduction).
    Si tu Id est unique précise le sinon ORACLE ne peut créer de clé étrangère (possible sur pK ou UNIQUE CONSTRAINT):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    alter table T_TRADUCTION  add constraint UQ_T_TRADUCTION unique (TRAD_ID);
    Ensuite tupeuxr créer ta référence comme avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table T_RUBRIQUE 
       add constraint FK_T_RUBRIQ_FK_RUBR_T_T_TRADUC foreign key (RUBR_ID_TRAD) 
          references T_TRADUCTION (TRAD_ID);
    Tu étais vraiement pas loin qd même

    Bon courage

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Par défaut
    Excusez-moi je me suis trompé dans mon explication, le champ trad_id n'est pas unique en faite. Est-ce que c'est possible de faire quelque chose quand même ?

    Merci quand même pour le tuyau

  4. #4
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    Non, une foreign key est un clé qui pointe sur une données unique qu'elle soit composé de 1 ou plusieurs champs.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2006
    Messages : 18
    Par défaut


    Il me semble qu'une clé étrangère doit référencer une clé primaire et pas un champ. Comme ta clé primaire est composé de 3 champs, référence donc sur les 3 champs de ta table T_TRADUCTION.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table T_RUBRIQUE 
       add constraint FK_T_RUBRIQ_FK_RUBR_T_T_TRADUC foreign key (RUBR_ID_TRAD) 
          references T_TRADUCTION (TRAD_ID_CLIE, TRAD_ID_LANG, TRAD_ID);
    C'est l'ensemble de tes 3 champs qui doit être unique.
    Tcho

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Par défaut
    le nombre de colonnes de référence doit correspondre au nombre de colonnes référencées

    Mais merci quand même

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Par défaut
    En fait il n'est pas possible de vérifier l'intégrité réferentielle sur une colonne qui n'est pas unique ?

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Par défaut
    cela n'a tout simplement pas de sens.
    Si l'objet que l'on référence n'est pas unique, lequel référence-t'on?

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Par défaut
    Alors je retourne ma question :

    Est-il possible de référencer plusieurs enregistrements qui portent la même clé ?

    J'aimerais juste avoir le contrôle de l'intégrité réferentielle en fait.

  10. #10
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    Oui, regarde l'exemple suivant
    Code : 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
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    SQL>create table client(num_cli number(2), nom varchar2(50));
     
    Table créée.
     
    SQL>
    SQL>alter table client add constraint pk_client primary key (num_cli);
     
    Table modifiée.
     
    SQL>
    SQL>create table voiture(num_voit number(2), num_cli number(2), marque varchar2(50));
     
    Table créée.
     
    SQL>
    SQL>alter table voiture add constraint pk_voiture primary key (num_voit, num_cli);
     
    Table modifiée.
     
    SQL>
    SQL>alter table voiture add constraint fk_voiture_client foreign key (num_cli) references client (nu
    m_cli);
     
    Table modifiée.
     
    SQL>
    SQL>insert into voiture values(1,1,'VW');
    insert into voiture values(1,1,'VW')
    *
    ERREUR à la ligne 1 :
    ORA-02291: violation de contrainte (ETOILE.FK_VOITURE_CLIENT) d'intégrité - touche parent
    introuvable
     
     
    SQL>
    SQL>insert into client values(1,'client 1');
     
    1 ligne créée.
     
    SQL>
    SQL>insert into voiture values(1,1,'VW');
     
    1 ligne créée.
     
    SQL>
    SQL>insert into voiture values(2,1,'VW');
     
    1 ligne créée.
     
    SQL>
    SQL>select * from client;
     
       NUM_CLI NOM
    ---------- --------------------------------------------------
             1 client 1
     
    SQL>
    SQL>select * from voiture;
     
      NUM_VOIT    NUM_CLI MARQUE
    ---------- ---------- --------------------------------------------------
             1          1 VW
             2          1 VW
     
    SQL>

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2003
    Messages : 25
    Par défaut
    Je sais que ca ne marche pas !

    Mais est il possible de mettre un contrainte pour vérifier si la traduction insérer dans t_rubrique existe ?

    Avec une contrainte du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ALTER TABLE t_rubrique
        ADD CONSTRAINT constraint_controle_trad
            CHECK (rubr_id_trad in (SELECT trad_id FROM t_traduction))
    J'ai essayé ceci, mais il n'est pas possible de faire la reqûête select !

    Je sais bien que je pourrais faire ceci par un trigger ! mais si il y'a un autre moyen je préférerais pas.

  12. #12
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Non, une contrainte CHECK ne peut contenir que des références à des colonnes de la ligne courante de la table courante: on ne peut pas référencer d'autres lignes de la même table, on ne peut pas mettre de SELECT et on ne peut pas référencer des lignes d'une autre table.

    Pour votre problème, le trigger semble la meilleure solution.

Discussions similaires

  1. [MySQL] Faire un SELECT COUNT sur une clé primaire composée de 3 colonnes
    Par z_ahlam dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/01/2023, 14h04
  2. Sélection sur une clé primaire composée
    Par defluc dans le forum Requêtes
    Réponses: 7
    Dernier message: 26/05/2015, 14h31
  3. Foreign key sur clé primaire composée
    Par mona dans le forum Oracle
    Réponses: 6
    Dernier message: 13/10/2005, 22h36
  4. recherche enr dans table sur clé primaire
    Par access001 dans le forum Requêtes
    Réponses: 10
    Dernier message: 10/10/2003, 10h45
  5. clé primaire composée de 2 clés étrangères
    Par Tigresse dans le forum Installation
    Réponses: 5
    Dernier message: 28/07/2003, 14h38

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