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.
]]>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;
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.
]]>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.