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é,