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

SQL Oracle Discussion :

clé étrangère non référencée dans la table cible après insertion de données.


Sujet :

SQL Oracle

  1. #1
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut clé étrangère non référencée dans la table cible après insertion de données.
    Bonjour, Bonne année à tous.

    j'ai un soucis avec mes clés étrangères après insertion de données. en effet, j'ai créé une table groupe avec une clé étrangère qui est l'ID de la table historique. Après insertion de données dans la table historique, je ne retrouve pas l'ID de la table historique comme clé étrangère dans la table groupe alors qu'un index a été créé qui est celui-ci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE UNIQUE INDEX "AIR JAVA"."CHANGEMENT_FK" ON "AIR JAVA"."GROUPE" ("HISTORIQUE_ID");


    Ma question est, comment faire apparaître ma clé étrangère de la table historique dans les données de ma table groupe. Merci

    ps : j'utilise oracle 11g

  2. #2
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut clé étrangère non référencée dans la table cible après insertion de données.
    Bonjour, Bonne année à tous.

    j'ai un soucis avec mes clés étrangères après insertion de données. en effet, j'ai créé une table groupe avec une clé étrangère qui est l'ID de la table historique. Après insertion de données dans la table historique, je ne retrouve pas l'ID de la table historique comme clé étrangère dans la table groupe alors qu'un index a été créé qui est celui-ci :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE UNIQUE INDEX "AIR JAVA"."CHANGEMENT_FK" ON "AIR JAVA"."GROUPE" ("HISTORIQUE_ID");


    Ma question est, comment faire apparaître ma clé étrangère de la table historique dans les données de ma table groupe. Merci
    PS: j'utilise oracle 11g

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    ce n'est pas un create index qu'il te faut mais un alter table add constraint.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ALTER TABLE 
      GROUPE 
    ADD CONSTRAINT 
      CHANGEMENT_FK
    FOREIGN KEY 
      (HISTORIQUE_ID) 
    REFERENCES 
      HISTORIQUE(HISTORIQUE_ID);

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Je suis pas sûr d'avoir compris....

    1. tu crées une table "historique" avec un champ "id"
    2. tu crées une table "groupe" avec un champ "historique_id" qui est une clé étrangère sur le champ "id" de la table "historique"
    3. tu insères une ligne dans la table "historique"

    et tu voudrais qu'une nouvelle ligne soit automatiquement insérée dans la table groupe?????

  5. #5
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    merci oracle vip, mais j'ai déjà ajouter mes contraintes pour les clés étrangères, mais à l'insertion des données, mes clés étrangères ne sont pas dans le table cible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ALTER TABLE "AIR JAVA'."GROUPE" 
    ADD CONSTRAINT "GROUPE_CHANGEMEN_HISTORIQ_FK1" 
    FOREIGN KEY ("HISTORIQUE_ID")
    	  REFERENCES "AIR JAVA"."HISTORIQUE" ("HISTORIQUE_ID") ON DELETE CASCADE ENABLE
    je pensais que la clé étrangère se posait automatiquement dans la table groupe après avoir inséré des données dans la table historique, mais je n'ai rien dans la table groupe.

  6. #6
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    exactement, j'illustre la table groupe.
    donc j'ai
    GROUPE_ID
    HISTORIQUE_ID

    ensuite, si j'insers des données dans historique, l'id de cellui-ci doit s'inserer automatiquement dans la table groupe pour constituer ses données.

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    tu veux dire, que de la même manière que fonctionne le "ON DELETE CASCADE", tu voudrais aussi un "ON INSERT CASCADE" ?

    Non, les clés étrangère n'insèrent pas "automatiquement" les données, elles ne sont la que pour valider les contraintes d'intégrité.

  8. #8
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    ah ok, alors comment je fais pour insérer des données dans ma table groupe sachant que les seuls données de cette table c'est l'id de l'historique à part bien sure sa clé primaire groupe_id.
    merci

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Mais la clé étrangère signifie simplement que cette colonne là doit référencer un historique_id qui est forcément existant. Ca ne veut pas dire que ça va te remplir les lignes automatiquement!
    Si tu as 10 champs dans ta table groupe, comment tu veux qu'il insère une nouvelle ligne automatiquement? avec 9 champs à null et 1 champ qui vaut la nouvelle valeur de la clé? je ne vois pas quel intérêt ça aurait, et en plus ce ne serait pas toujours possible (si tu as une clé primaire ou des champs not null....). Dans ton cas, oracle ne pourrait pas deviner tout seul la valeur de group_id.

    La création d'un index signifie simplement que tu pourras accéder rapidement aux données quand tu feras un "select .... where historique_id = 3", mais c'est uniquement de la consultation de lignes qui ont été précédemment insérées, ça ne t'insère rien automatiquement.

  10. #10
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    Ok, merci pour ton aide, je vais revois mon MCD est générer un nouvel MPD.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Sans savoir ce que veulent dire MCD et MPD j'ai un peu du mal à comprendre ta réponse, mais content de t'avoir aidé :p

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 207
    Points : 237
    Points
    237
    Par défaut
    MCD=Modèle Conceptuel de données
    MPD=Modèle Phyisque de données.

    Mais a mon avis, c'est les bases du SQL qu'il faut revoir !

    Laurent

  13. #13
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    les bases du sql??
    donc tu pourrais savoir comment inséré automatiquement une clé étrangère dans la table où elle est référencée??

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Tu peux toujours créer un trigger qui dit qu'à chaque ajout dans la table historique, tu fais un ajout dans la table groupe. Mais d'où sors-tu alors la valeur de group_id?

  15. #15
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    le groupe id est aussi est référencé comme clé étrangère de la table personne, alors s'il n'y a pas de ID groupe, impossible de rentrer des données dans la table personnes. raison pour laquelle je voulais à partir de la table historique, réglé tout ça.
    sinon, le trigger que tu me conseilles, comment l'aurais tu fais??

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Mais comment génères-tu ton groupid??
    La correspondance entre groupid et historiqueid est-elle en 1 pour 1?

    Pour écrire un trigger tu peux t'inspirer de ce code qui sert à émuler une colonne auto-incrémentée. C'est à dire qu'à chaque insertion dans la table Matable, tu incrémentes un compteur de 1 et tu l'insères dans une des colonnes de la table.
    Dans ton cas tu aurais besoin de la même chose sauf que tu lancerais un nouvel insert dans une autre table.

    Mais je ne vois toujours pas comment tu génères ton groupid....

    http://oracle.developpez.com/faq/?pa...#autoincrement

  17. #17
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    mon group_id est généré par un trigger auto-increment que j'ai déjà crée, voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    create or replace TRIGGER GROUPE_TRG
    BEFORE INSERT
    ON GROUPE
    REFERENCING NEW AS NEW
    FOR EACH ROW
    BEGIN
    SELECT GROUPE_SEQ.nextval INTO :NEW.GROUPE_ID FROM dual;
    END;
    oui correspondance 1 pour 1.
    donc, à chaque insertion de mon historique faut qu'il y ait un trigger qui insers directement l'ID de l'historique dans la table groupe. ok, je jette un coup d'oeil sur ton lien, merci

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 136
    Points : 112
    Points
    112
    Par défaut
    Si c'est du 1 pour 1, j'aurais tout simplement mis le champ group_id à l'intérieur de la table historique.... pourquoi deux tables?

  19. #19
    Membre habitué Avatar de cashmoney
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 298
    Points : 149
    Points
    149
    Par défaut
    c'est sure que tu as raison, je vais donc éliminer la table historique et fusionner avec la table groupe, car la table historique est censé comporté la nom du groupe et sa date de création histoire de garder les traces du groupe si jamais il changeait de nom. en gros voilà

Discussions similaires

  1. Réponses: 2
    Dernier message: 27/07/2011, 13h16
  2. Récupérer des lignes non enregistrées dans une table
    Par leddy dans le forum Langage SQL
    Réponses: 2
    Dernier message: 24/04/2008, 16h09
  3. nombre de valeurs non nulles dans une tables
    Par 080983 dans le forum SQL
    Réponses: 33
    Dernier message: 27/08/2007, 13h04
  4. Réponses: 6
    Dernier message: 29/06/2006, 11h36
  5. Réponses: 3
    Dernier message: 19/06/2006, 15h25

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