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 :

Problème d'insertion due au clé étangère


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Problème d'insertion due au clé étangère
    Bonjour,

    Voici mon problème j'ai deux tables qui dépendent l'une de l'autre par des clés étrangères dont le schéma est le 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
     
    create table adresse (
        num_rue                 number(4),
        nom_rue                 varchar2(30),
        cp                      number(5),
        nom_ville               varchar2(30),
        num_caserne_proche      number(6)       not null,
        km                      number(4),
        primary key(num_rue, nom_rue, cp , nom_ville)
    )
    create table caserne (
        num                     number(6)       primary key,
        capacite_max_camions    number(4),
        capacite_max_humaine    number(5),
        num_rue                 number(4)       not null,
        nom_rue                 varchar2(50)    not null,
        cp                      number(5)       not null,
        nom_ville               varchar2(30)    not null
    )
    alter table adresse
        add constraint fk_adresse_caserne foreign key(num_caserne_proche) references caserne(num)
    alter table caserne
        add constraint fk_caserne_adresse foreign key(num_rue, nom_rue, cp, nom_ville) references adresse(num_rue, nom_rue, cp, nom_ville)
    De par cette situation je ne peux pas insérer de tuple dans l'une de ces deux tables car j'ai une erreur de violation m'indiquant que la clé parente est introuvable.
    Il y a soit disant une solution autre que de faire les insert avant les alter mais je ne vois pas.
    Merci pour votre aide, ++

    Nico

  2. #2
    Membre habitué Avatar de kazhar
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2006
    Messages
    126
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2006
    Messages : 126
    Points : 148
    Points
    148
    Par défaut
    Je doute qu'il y ait une solution avec ce modèle physique.
    En revanche, tu n'a qu'une seule caserne par rue si je ne me trompe pas.
    Auquel cas, pourquoi ne pas remplacer "num_caserne_proche" par "num_rue_caserne_proche"
    Ainsi, tu a une relation entre caserne et rue (tu n'a besoin de stocker, dans la table caserne, que le numéro de la rue. le reste dépends de ce numéro, et doit donc être placé dans l'entité rue)
    Et tu a une relation entre rue et rue. Si la rue possède une caserne, tu la mets en relation avec elle même.

    J'espère que c'est suffisamment clair.

  3. #3
    Membre éprouvé
    Avatar de goldkey
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    802
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mars 2003
    Messages : 802
    Points : 1 084
    Points
    1 084
    Par défaut
    Citation Envoyé par kazhar
    Je doute qu'il y ait une solution avec ce modèle physique.
    Effectivement ce modele me parait mal adapté au besoin !!!

    Es-tu sur un projet ou dois-tu te depatouillé sur un systeme existant ??

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    En faite c'est par rapport à un projet à faire en cours. L'énoncé est comme cela. Je me doute que dans la véritable pratique on éviterais ce genre de contrainte très contraignantes !!!

    J'ai posé la question a mon enseignant, il m'a dit qu'il existait des solutions et que je devais chercher !! Mais franchement je sèche

  5. #5
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut


    Un tel modèle est tout simplement idiot, tu duplique les champs de l'adresse dans la table caserne, et le champ num_caserne_proche n'a pas beaucoup de sens.

    De plus, batîr un modèle avec des clés réciproques est franchement déconseillé, ça résulte en général d'une mauvaise modélisation

    C'est un prof de quoi qui t'a demandé ça ?


    Une solution (idiote, bien entendu) serait de désactiver une des 2 contraintes, faire tes 2 insert dans le bon ordre, et réactiver la contrainte derrière. Il va de soi qu'une telle solution est tout juste valable pour voir si tu sais désactiver/réactiver une contrainte, mais jamais tu ne verras ça dans un logiciel fait par des gens qui ont un minimum de notion en informatique.

  6. #6
    Futur Membre du Club
    Inscrit en
    Décembre 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Décembre 2006
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Notre prof est chercheur en Informatique en plus d'être enseignant. C'est pour un master informatique. Mais chut ! on ne sait jamais s'il passe par là

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 874
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 874
    Points : 53 048
    Points
    53 048
    Billets dans le blog
    6
    Par défaut
    Le modèle est PARFAITEMENT correct. EN effet SQL Permet des références circulaires de dépendances de tables.

    Soit le Serveur accepte la déférabilité des contraintes, auquel cas vous faites un SET CONTRAINTS INITIALLY DEFFERED,
    soit le serveur n'accepta pas cett technique et vous devez faire en 3 temps :
    1) INSERT dans clef étrangère dans table 1
    2) INSERT avec clef étrangère dans table 2 vers table1
    3) rajout de la clef étrangère dans table 1

    POur plus d'information, voyez la chpitre consacré aux transaction dans mon dernier bouquin,il y a des exemples de déférencement des contraintes !

    A +

  8. #8
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par SQLpro
    Le modèle est PARFAITEMENT correct. EN effet SQL Permet des références circulaires de dépendances de tables.
    Techniquement, en SQL, pourquoi pas, mais conceptuellement parlant, il est tout de même fort discutable, non ?

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 102
    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 102
    Points : 31 545
    Points
    31 545
    Billets dans le blog
    16
    Par défaut Au feu !
    Bonjour Nicottin,

    Citation Envoyé par Xo
    SQLpro a écrit :
    Le modèle est PARFAITEMENT correct. EN effet SQL Permet des références circulaires de dépendances de tables.
    Techniquement, en SQL, pourquoi pas, mais conceptuellement parlant, il est tout de même fort discutable, non ?
    Je confirme ce que dit Xo !
    Nicottin, la représentation tabulaire que vous fournissez pose quelques problèmes d’interprétation, c’est le moins que l’on puisse dire.

    On efface tout et on recommence : Plutôt que de partir sur un comment fort bizarre, fournissez un énoncé de votre sujet, exprimez le QUOI, en français, c’est-à-dire ce que vous cherchez à représenter. Illustrez par des exemples concrets. Deux Create Table plus ou moins redondants ne constituent pas un énoncé...

  10. #10
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    INSERT dans clef étrangère dans table 1
    Je suppose que tu voulais dire "INSERT sans clef étrangère dans table 1"

    Etant donné que les clés étrangères sont en NOT NULL, je ne vois pas comment faire

  11. #11
    Expert éminent sénior

    Avatar de Tofalu
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Octobre 2004
    Messages
    9 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Octobre 2004
    Messages : 9 501
    Points : 32 311
    Points
    32 311
    Par défaut
    De plus une clé primaire veut dire que ses champs sont requis

    PRIMARY KEY(num_rue, nom_rue, cp , nom_ville)


    Comment tu me stockes l'adresse

    Place du Général de Gaulle
    71000 MACON ?

    Tu fixes num_rue à 0 ?

    Pour moi le modèle est incorrect. De plus les types sont mal chosis. Un num_rue en number(4), je vais être mal barré pour inscrire le 3bis. Soit on laisse le num tel quel, soit on rajoute un champs suffixe

  12. #12
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Tu as eu la solution de l'exercice ? Juste pour voir si Frédéric a bon

Discussions similaires

  1. problème d'insertion de données
    Par Falgan dans le forum ASP
    Réponses: 2
    Dernier message: 06/04/2004, 09h29
  2. Probléme d'insertion par défault
    Par xavier62 dans le forum SQL
    Réponses: 7
    Dernier message: 28/11/2003, 13h03
  3. [Interbase 7] Problème d'insertion de données
    Par Tuscelan dans le forum InterBase
    Réponses: 12
    Dernier message: 19/11/2003, 22h58
  4. STL : std::set problème avec insert ...
    Par Big K. dans le forum MFC
    Réponses: 13
    Dernier message: 08/11/2003, 01h02
  5. Problème d'insertion avec MySQL
    Par Sonny dans le forum ASP
    Réponses: 13
    Dernier message: 28/08/2003, 13h52

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