Vous n'êtes pas identifié(e).

#1 03/10/2013 16:28:05

stc
Membre

Problème d'insertion avec une clé étrangère non reconnue.

Bonjour j'ai une table users :

CREATE TABLE users
(
  mail_address character varying(100),
  nickname character varying(100),
  last_name character varying(100),
  first_name character varying(100),
  pass character varying(40),
  phone character varying(14),
  id serial NOT NULL,
  cookie_code character varying(40),
  date_register date DEFAULT ('now'::text)::date,
  siren_number character(9),
  CONSTRAINT pk_user PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);
ALTER TABLE users
  OWNER TO admin;

-- Index: pki_user

-- DROP INDEX pki_user;

CREATE INDEX pki_user
  ON users
  USING btree
  (id );

une table projects :

CREATE TABLE projects
(
  id serial NOT NULL,
  title character varying(100),
  description text,
  id_tarif integer,
  date_rec date DEFAULT ('now'::text)::date,
  id_user integer NOT NULL,
  CONSTRAINT pk_project PRIMARY KEY (id ),
  CONSTRAINT fk_tarif FOREIGN KEY (id_tarif)
      REFERENCES tarifs (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE,
  CONSTRAINT fk_user FOREIGN KEY (id_user)
      REFERENCES users (id) MATCH SIMPLE
      ON UPDATE CASCADE ON DELETE CASCADE
)
WITH (
  OIDS=FALSE
);
ALTER TABLE projects
  OWNER TO admin;

-- Index: fki_tarif

-- DROP INDEX fki_tarif;

CREATE INDEX fki_tarif
  ON projects
  USING btree
  (id_tarif );

-- Index: fki_user

-- DROP INDEX fki_user;

CREATE INDEX fki_user
  ON projects
  USING btree
  (id_user );

j'essaie de faire un insert dans projects en spécifiant pour id_user l'id d'un enregistrement de la table users (et il existe j'ai vérifié)
Java lève une exception dont le message est le suivant :

ERROR: insert or update on table "projects" violates foreign key constraint "fk_user" Détail : Key (id_user)=(10) is not present in table "users".

C'est ma première expérience en postgresql, je suis plus habitué à mySQL, j'ai du louper quelque chose mais je ne vois pas quoi.
Merci pour votre aide.

Hors ligne

#2 03/10/2013 20:13:06

gleu
Administrateur

Re : Problème d'insertion avec une clé étrangère non reconnue.

J'ai testé avec votre schéma (en supprimant la clé étrangère vers la table trafic), et cela fonctionne très bien :

postgres=# insert into projects (id_user) values (10);
ERROR:  insert or update on table "projects" violates foreign key constraint "fk_user"
DETAIL:  Key (id_user)=(10) is not present in table "users".
postgres=# insert into users (id) values (10);
INSERT 0 1
postgres=# insert into projects (id_user) values (10);
INSERT 0 1

Si PostgreSQL vous indique que la clé 10 n'est pas présente dans la colonne id de la table users, je suis prêt à parier qu'il a raison. Essayez d'insérer un ligne avec id à 10 pour la table users. Si l'insertion échoue, il y a un problème. Si elle réussit, c'est qu'elle manquait vraiment.


Guillaume.

Hors ligne

#3 03/10/2013 20:41:35

stc
Membre

Re : Problème d'insertion avec une clé étrangère non reconnue.

oui, j'ai obligé de préciser que j'ai une table user_projects qui herite de users, c'est dans user_projects que j'ai inséré l'utilisateur, cependant dans pgadmin cette utilisateur apparaît aussi dans users mais apparemment pas réellement car java me refuse l'insertion, je pensais que le fait d’insérer un utilisateurs dans user_projects se répercutait sur users, je ne vois pas l'intérêt de l'héritage autrement .

CREATE TABLE users_project
(
  mail_address character varying(100),
  nickname character varying(100),
  last_name character varying(100),
  first_name character varying(100),
  pass character varying(40),
  phone character varying(14),
  id integer NOT NULL DEFAULT nextval('users_id_seq'::regclass),
  cookie_code character varying(40),
  date_register date DEFAULT ('now'::text)::date,
  siren_number character(9)
)
INHERITS (users)
WITH (
  OIDS=FALSE
);
ALTER TABLE users_project
  OWNER TO admin;

Hors ligne

#4 03/10/2013 22:57:08

gleu
Administrateur

Re : Problème d'insertion avec une clé étrangère non reconnue.

L'héritage ne fait pas que vous avez les données dans les deux tables. Si vous faites un SELECT sur users, vous la verrez. Si vous faites un SELECT sur users en utilisant la clause ONLY, vous ne la verrez pas.

Concernant votre problème original, la documentation est très claire : les clés étrangères ne vérifient que la table visée, pas les tables filles. C'est un des inconvénients majeurs du partitionnement avec PostgreSQL.


Guillaume.

Hors ligne

Pied de page des forums