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 :

violation de clef étrangère


Sujet :

PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 55
    Par défaut violation de clef étrangère
    Bonjour;

    Je crée 2 tables t_client et t_titre:

    t_client

    Colonne | Type | Modificateurs
    --------------+------------------------+-----------------------------------------------------------
    cli_id | integer | not null default nextval('t_client_cli_id_seq'::regclass)
    tit_code | character(15) | not null
    cli_nom | character(32) | not null
    cli_prenom | character varying(25) |
    cli_enseigne | character varying(100) |
    Index :
    « t_client_pkey » PRIMARY KEY, btree (cli_id)
    Contraintes de clés étrangères :
    « t_client_tit_code_fkey » FOREIGN KEY (tit_code) REFERENCES t_titre(tit_code)

    et la table t_titre:

    Colonne | Type | Modificateurs
    -------------+-----------------------+---------------
    tit_code | character(15) | not null
    tit_libelle | character varying(32) | not null
    Index :
    « t_titre_pkey » PRIMARY KEY, btree (tit_code)

    Lorsque j'inserts les données dans la table t_client, ça génère l'erreur suivante:

    copy t_client from '/home/postgres/T_CLIENT.txt' with delimiter ',';
    ERROR: insert or update on table "t_client" violates foreign key constraint "t_client_tit_code_fkey"
    DETAIL: Key (tit_code)=( 'M.' ) is not present in table "t_titre".

    Je ne sais pas pourquoi car 'M.' est bien présent dans la table t_titre.
    Voici le contenu de la table:

    tit_code | tit_libelle
    -----------------+--------------------------
    'M.' | Monsieur'
    'Melle.' | 'Mademoiselle'
    'Mme.' | 'Madame'

    Je pense qu'il y a quelque chose qui m'échappe, car à mon avis la solution est claire
    Merci de votre aide

  2. #2
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut character varying
    ce ne serait pas une histoire de caractère varying.

    Quand tu dis que tu as une ligne avec 'M.' pour champ titre dans ta table t_titre as-tu vraiment 'M.' ou 'M. ' ?

    Assures-toi que ça ne vient pas d'un problème de ce genre (passes plus simplement en charvar) car sinon je ne vois pas d'anomalie flaggrante.

  3. #3
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut re
    Quand tu dis que tu as une ligne avec 'M.' pour champ title dans ta table t_title as-tu vraiment 'M.' ou 'M. _____des espaces______' ?

  4. #4
    Membre confirmé
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Par défaut Bah c'est pas ça.
    Re,

    j'ai testé le script suivant sous postgre :

    CREATE TABLE t_client
    (
    cli_id integer not null ,
    tit_code character(15) not null,
    cli_nom character(32) not null,
    cli_prenom character varying(25),
    cli_enseigne character varying(100),
    PRIMARY KEY(cli_id)
    );

    CREATE TABLE t_titre
    (
    tit_code character(15) not null,
    tit_libelle character varying(32) not null,
    PRIMARY KEY (tit_code)
    );

    ALTER TABLE t_client ADD CONSTRAINT t_client_tit_code_fkey FOREIGN KEY (tit_code) REFERENCES t_titre(tit_code);

    INSERT INTO t_titre(tit_code, tit_libelle)
    VALUES( 'M.', 'MONSIEUR');

    INSERT INTO t_client(cli_id, tit_code, cli_nom)
    VALUES( 28, 'M.', 'PANCH');

    SELECT * FROM t_client;

    --A ce stade aucun problème n'est survenu.
    --Donc tes définitions semblent OK.

    --Par contre :

    INSERT INTO t_client(cli_id, tit_code, cli_nom)
    VALUES( 28, 'M. ', 'PANCH');

    --Leve l'erreur suivante : ERROR: duplicate key violates unique constraint "t_client_pkey"

    --Donc ça devrait fonctionner si tu ne t'es pas trompé dans les espaces. A voir dans ton txt et dans ta table t_title...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 55
    Par défaut
    Citation Envoyé par VASAPANCH Voir le message
    Quand tu dis que tu as une ligne avec 'M.' pour champ title dans ta table t_title as-tu vraiment 'M.' ou 'M. _____des espaces______' ?
    j'ai un 'M.'

    j'étais pressée ce jour-là et j'ai inséré les données à la main (comme elles n'étaient pas nombreuses), et que ça marchait à la main!

    Par contre je rencontre le même problème pour le chargement d'une autre table:t_facture

    Colonne | Type | Modificateurs
    --------------+--------------+------------------------------------------------------------
    fac_id | integer | not null default nextval('t_tacture_fac_id_seq'::regclass)
    cli_id | integer | not null
    pmt_code | character(8) |
    fac_date | date | not null
    fac_pmt_date | date | not null
    Index :
    « t_tacture_pkey » PRIMARY KEY, btree (fac_id)
    Contraintes de clés étrangères :
    « t_tacture_cli_id_fkey » FOREIGN KEY (cli_id) REFERENCES t_client(cli_id)
    « t_tacture_pmt_code_fkey » FOREIGN KEY (pmt_code) REFERENCES t_mode_paiement(pmt_code)

    la table t_mode_paiement

    Colonne | Type | Modificateurs
    -------------+-----------------------+---------------
    pmt_code | character(8) | not null
    pmt_libelle | character varying(64) | not null
    Index :
    « t_mode_paiement_pkey » PRIMARY KEY, btree (pmt_code)



    Voici ce que ça me génère lorsque je tape la commande Copy


    CT32=# copy t_facture from '/home/postgres/T_FACTURE.txt' with delimiter ',';
    ERROR: insert or update on table "t_facture" violates foreign key constraint "t_tacture_pmt_code_fkey"
    DETAIL: Key (pmt_code)=( 'CB' ) is not present in table "t_mode_paiement".
    STATEMENT: copy t_facture from '/home/postgres/T_FACTURE.txt' with delimiter ',';
    ERROR: insert or update on table "t_facture" violates foreign key constraint "t_tacture_pmt_code_fkey"
    DETAIL: Key (pmt_code)=( 'CB' ) is not present in table "t_mode_paiement".



    Le contenu de la table t_mode_paiement est :

    CT32=# select * from t_mode_paiement;
    pmt_code | pmt_libelle
    ----------+---------------------
    'CB' | 'Carte bancaire'
    'CHQ' | 'Chèque'
    'ESP' | 'Espèces'

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 55
    Par défaut
    L'insertion manuelle génère aussi une erreur

    insert into t_facture(fac_id,cli_id,pmt_code,fac_date,fac_pmt_date) values(1,1,'CB','1999-01-31','1999-02-14');
    ERROR: insert or update on table "t_facture" violates foreign key constraint "t_tacture_pmt_code_fkey"
    DETAIL: Key (pmt_code)=(CB ) is not present in table "t_mode_paiement".


    pour votre aide

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 55
    Par défaut
    l'insertion manuelle marche maintenant!

    insert into t_facture(fac_id,cli_id,pmt_code,fac_date,fac_pmt_date) values (1,1,'CB','1999-06-05','1999-04-03');
    INSERT 0 1

    j'ai supprimé les quotes de la colonne pmt_code dans la table t_mode_paiement:

    pmt_code | pmt_libelle
    ----------+--------------------------
    CB | 'Carte bancaire'
    CHQ | 'Chèque'
    ESP | 'Espèces'

    quand je fais la même insertion ci-dessus dans la table t_facture, ça ne marche pas

Discussions similaires

  1. tests de script et clefs étrangères en INSERT
    Par Invité dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/08/2005, 17h15
  2. clef étrangère référençant une autre base
    Par menoce dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 06/07/2005, 19h31
  3. 5 clefs étrangères?
    Par P@t dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 15/05/2005, 16h52
  4. [wamp5] [Relations] Clefs étrangéres
    Par nebule dans le forum Outils
    Réponses: 6
    Dernier message: 05/10/2004, 11h17
  5. [SQL SERVER 2000] Problème clef étrangére
    Par Tankian dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 11/05/2004, 10h44

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