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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 55
    Points : 18
    Points
    18
    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 régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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 régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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 régulier
    Inscrit en
    Avril 2008
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 89
    Points : 83
    Points
    83
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 55
    Points : 18
    Points
    18
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 55
    Points : 18
    Points
    18
    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 à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 55
    Points : 18
    Points
    18
    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

  8. #8
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    j'ai un problème similaire et je n'arrives pas encore à le régler.

    j'ai une table "personne" et deux tables "personne_morale" et "persone_physique" qui héritent de "personne".

    "personne" est liée à "exploitation" par une table issue d'association : "exploitation_personne". lorsque j'insère les données, avec une requête où à la main, il n'y a pas de problème.

    cependant, j'ai une autre partie de ma base avec des héritages et là ça ne foncitonne pas, j'ai la même erreur que vous. pourtant, c'est la même structure de table.

    avez vous, naru, des héritages sur les tables qui posent problème ?

    est-ce que quelqu'un sait si ça peut venir de là ?

    merci

  9. #9
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Points : 38
    Points
    38
    Par défaut
    bonjour,

    mon problème ne survient plus, j'ai supprimé les tables dont héritait ma "sur-table".

    j'avais une table "A" et des tables "A1","A2"et "A3" dont certains de leurs champs se répercutaient dans "A" et notamment leurs clés primaires respectives étant clé primaire de "A".

    et j'avais une table "B" et une table issue d'association "A_B".

    j'ai refait la liaison entre "A" et "B" en supprimant les héritages et ça fonctionne.

    ça à l'aire d'être l'héritage qui pose problème mais ou ???

    je ne comprends pas pourquoi car dans le cas de "personne", "exploitation" et "exploitation_personne" il n'y pas de problème avec l'héritage.

    ???.....

  10. #10
    Nouveau membre du Club
    Inscrit en
    Septembre 2008
    Messages
    68
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 68
    Points : 38
    Points
    38
    Par défaut
    pour ceux que ça intéresse,

    j'ai posté une discussion concernant les héritages et le problème d'insertion des tables issues d'association à l'adresse suivante :

    http://www.developpez.net/forums/d62...-dassociation/

    ça vous aidera peut-être.

    à plus

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