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

PostgreSQL Discussion :

clé primaire/clé étrangère


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut clé primaire/clé étrangère
    Bonjour,

    j'ai un petit problème fondamentale de SQL:

    d'abord les 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
    CREATE TABLE t1(
    np int REFERENCES autre_table (champs),
    nt int REFERENCES autre_table (champs),
    na SERIAL UNIQUE NOT NULL,
    PRIMARY KEY (na,np,nt)
    ) WITH OIDS;
     
    CREATE TABLE t3(
    nq SERIAL UNIQUE NOT NULL,
    np int NOT NULL, 
    nt int NOT NULL,
    na int NOT NULL,
    FOREIGN KEY (na,np,nt) REFERENCES t1 (na,np,nt)[/INDENT]
    ) WITH OIDS;
    les tables ont ete créées sans problème

    valeurs de t1 (la clé primaire est bien 1,3,1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     np |  nt | na 
    ----+----+---
       3 |  1 | 1
    losrque que je veux remplir t2 avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO t2 VALUES (DEFAULT,3,1,1);
    je recois le message d'erreur suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ERREUR:  Une instruction insert ou update sur la table t1 viole la contrainte de clé étrangère t1_fkey
    DÉTAIL : La clé (na,np,nt)=(1,3,1) n est pas présente dans la table t1

    je ne comprends pas ou se trouve le probleme:
    1- une clé etrangère fait bien référence à une clé primaire (multiple)
    2- pour ne pas faire référence à une clé primaire elle même clé étrangère, il y a dans cette clé primaire multiple (de t1) le champs "na" qui n'est pas une référence, qui est unique et non nulle (un index est créé pour na et un autre pour (na,np,nt) ).

    Le SGBG (ici postgre) devrait pouvoir la retrouver (?)
    comment récupérer (np,nt) sans passer par les tables d'origines? (c'est le but de la manip)

    Merci à la communauté,

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Par défaut
    Coucou,
    Je pense que ton problème vient de l'ordre de tes colonnes, il ne faut presque jamais faire un insert into Table1 Values sans spécifier les colonnes , parce que si tu rajoute un champ dans la table ton insert foire.
    Et là l'ordre de tes colonnes ne semble pas être celui que tu imagines.
    Donc je propose simplement de spécifier les colonnes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO t2 (np,nt,na) VALUES (3,1,1);
    Tu t'es mélangé les crayons en voulant renommer tes tables tu décris la table t3 et tu insère dans t2 . Par ailleurs ton message d'erreur indique
    ERREUR: Une instruction INSERT ou UPDATE sur la TABLE t1
    Ne serait-ce pas plutôt sur la table t2?

    a+
    Soazig

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut clé primaire / clé étrangère
    tu as raison pour le message d'erreur il s'agit bien de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ERREUR:  Une instruction INSERT ou UPDATE sur la TABLE t2 viole la contrainte de clé étrangère t1_fkey
    DÉTAIL : La clé (na,np,nt)=(1,3,1) n est pas présente dans la TABLE t1
    même en spécifiant le nom des champs avec:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO t2 (nq,np,nt,na) VALUES (DEFAULT,3,1,1);
    j'obtiens le même message d'erreur.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut probleme d'OIDS ?
    Bon j'ai repris le probleme en créant mes tables SANS OIDS et ca fonctionne (?
    c'est super ca enleve mon probleme) Mais j'aimerai bien savoir pourquoi ca fonctionne et surtout pourquoi ca ne fonctionnait pas ? quel est le probleme avec l'OIDS ?

    Je pense que c'est une question qui pourrait intéresser pa mal de personnes.(non ?)

    Merci à tous,

  5. #5
    Membre chevronné Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Par défaut
    Bonjour,
    Comme ça m'intriguait j'ai fait le test complet (en postgres 8.2) :
    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
     
    tests=> CREATE TABLE t01(
    tests(> chp_t01 int,
    tests(> PRIMARY KEY (chp_t01)
    tests(> ) WITH OIDS;
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t01_pkey" for table "t01"
    CREATE TABLE
    tests=> insert into t01 values(3);
    INSERT 27496 1
    tests=>
    tests=> CREATE TABLE t02(
    tests(> chp_t02 int,
    tests(> PRIMARY KEY (chp_t02)
    tests(> ) WITH OIDS;
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t02_pkey" for table "t02"
    CREATE TABLE
    tests=> insert into t02 values(1);
    INSERT 27501 1
    tests=>
    tests=> CREATE TABLE t1(
    tests(> np int REFERENCES t01(chp_t01),
    tests(> nt int REFERENCES t02(chp_t02),
    tests(> na SERIAL UNIQUE NOT NULL,
    tests(> PRIMARY KEY (na,np,nt)
    tests(> ) WITH OIDS;
    NOTICE:  CREATE TABLE will create implicit sequence "t1_na_seq" for serial column "t1.na"
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "t1_pkey" for table "t1"
    NOTICE:  CREATE TABLE / UNIQUE will create implicit index "t1_na_key" for table "t1"
    CREATE TABLE
    tests=> insert into t1 values (3,1,1);
    INSERT 27521 1
    tests=> select * from t1;
     np | nt | na
    ----+----+----
      3 |  1 |  1
    (1 row)
     
    tests=>
    tests=> CREATE TABLE t2(
    tests(> nq SERIAL UNIQUE NOT NULL,
    tests(> np int NOT NULL,
    tests(> nt int NOT NULL,
    tests(> na int NOT NULL,
    tests(> FOREIGN KEY (na,np,nt) REFERENCES t1 (na,np,nt)) WITH OIDS;
    NOTICE:  CREATE TABLE will create implicit sequence "t2_nq_seq" for serial column "t2.nq"
    NOTICE:  CREATE TABLE / UNIQUE will create implicit index "t2_nq_key" for table "t2"
    CREATE TABLE
    tests=>
    tests=> INSERT INTO t2 VALUES (DEFAULT,3,1,1);
    INSERT 27534 1
    tests=> select * from t2;
     nq | np | nt | na
    ----+----+----+----
      1 |  3 |  1 |  1
    (1 row)
    Et ça fonctionne ... quelle est votre version de postgres ?
    L'insertion dans t1 est-il bien "commité" ?

    PS : Il s'agit d'un pb postgres, vous auriez eu plus de réponses dans le forum postgres

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 10
    Par défaut
    désolé au debut je pensais qu'il s'agissait d'un probleme de SQL et pas de posgre. Je me suis trompé.

    ton exemple fonctionne chez moi mais pas sur mes tables (???)
    tu veux dire quoi par "commité" ?
    (Merci)

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

Discussions similaires

  1. [Modèle Relationnel] toute clef étrangère est-elle considérée comme primaire et étrangère?
    Par johnny3 dans le forum Schéma
    Réponses: 15
    Dernier message: 30/01/2009, 17h49
  2. Clé primaire, clé étrangère
    Par Premium dans le forum Langage SQL
    Réponses: 1
    Dernier message: 15/11/2007, 12h27
  3. index et clef primaire et étrangère
    Par stos dans le forum Requêtes
    Réponses: 2
    Dernier message: 26/09/2006, 08h59
  4. Clé primaire, clé étrangère ou simple colonne?
    Par ilyassou dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 19/11/2005, 10h22
  5. [clé primaire et étrangère]
    Par viny dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/08/2003, 18h23

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