2015-11-23 1 views
0

im ayant cette erreur:PostgreSQL erreur de contrainte

ERROR: there is no unique constraint matching given keys for referenced table "vulling" 

Ceci est mon code pour faire une clé étrangère:

ALTER TABLE put_25_vlak_1_spoor 
ADD FOREIGN KEY (spoor,vulling) 
REFERENCES vulling(spoor,vulling); 

Les tables sont faites de cette façon:

CREATE TABLE put_25_vlak_1_spoor 
(
    id serial NOT NULL, 
    geometry_spoor geometry(MultiPolygon,28992), 
    spoor integer NOT NULL, 
    put integer, 
    vlak integer, 
    vulling integer NOT NULL, 
    CONSTRAINT put_25_vlak_1_spoor_pkey PRIMARY KEY (spoor, vulling) 
) 

CREATE TABLE vulling 
(
    vlak smallint, 
    textuur character varying(8), 
    vulling integer NOT NULL, 
    spoor integer NOT NULL, 
    put integer NOT NULL, 
    CONSTRAINT vulling_pkey PRIMARY KEY (vulling, put, spoor) 
) 

I lire ce fil sur stackoverflow mais je ne comprends pas tout à fait ce qu'ils disent:

PostgreSQL constraint problems

Postgresql constraint

What is causing ERROR: there is no unique constraint matching given keys for referenced table?

J'espère que quelqu'un peut me aider. Im très nouveau à postgres et ne comprends pas complètement comment les clefs étrangères fonctionnent.

Vive

Répondre

0

On (référencé) tableau vulling vous devez avoir des valeurs uniqe pour votre clé étrangère. Mais vous ne le faites pas. Vous avez des valeurs uniques pour le triplet (vulling, put, spoor) qui ne signifie pas nessecerly uniqness de la paire (spoor, vulling).

Tenir compte

vulling 
====================== 
vulling | put | spoor 
---------------------- 
1  | 0 | 0 
1  | 1 | 0 

que deux lignes sont uniqe en termes de triplet, mais pas comme une paire de vulling et spoor. À la fin, vous devez soit ajouter UNIQUE(vulling, spoor) à votre définition de table, soit gérer une relation plusieurs-à-plusieurs en utilisant helper-table.

Sinon, vous pouvez inverser te def clé étrangère:

ALTER TABLE vulling 
ADD FOREIGN KEY (spoor,vulling) 
REFERENCES put_25_vlak_1_spoor(spoor,vulling); 
+0

i aussi bien que je recherche avec cette sql: select Spoor, vulling de vulling groupe par Spoor, vulling comte ayant (*)> 1 et select Spoor, vulling de put_25_vlak_1_spoor groupe par Spoor, vulling comte ayant (*)> 1 mais il n'y avait pas de double enregistrement. J'ai un peu de double si je ne fais que le spoor. Peut-être que c'est le problème? – waywer

+0

Il ne s'agit pas seulement de non-dublication, il s'agit de ne jamais permettre la dublication. Vous obtenez cela en définissant une contrainte unique pour une paire de calums. –

+0

J'ai fait des deux colonnes une clé primaire. De cette façon, il n'y a pas de dublication (du moins je le pensais). Si je le rend unique la colonne, je ne peux pas faire quelque chose comme ceci: Spoor = 10 vulling = 1 et Spoor = 10 et vulling = 2.Mais je veux le faire dans ma base de données – waywer

0

Est-ce que vous avez des données dans la table vulling? Vous ne pouvez pas ajouter de données au put_25_vlak_1_spoor si le vulling n'existe pas les mêmes données dans les lignes, vulling.

à savoir si vous voulez ajouter au put_25_vlak_1_spoor un enregistrement, où Spoor = 111 et vulling = 222, dans le vulling doivent être une ligne où Spoor = 111 et vulling = 222

+0

Je l'ai vérifié et il y avait effectivement deux enregistrements qui existaient dans put25_vlak_1_spoor qui n'existaient pas dans vulling. Je les ai ajoutés à la table vulling. Mais j'ai toujours la même erreur. ps. J'ai plus de dossiers en vulling puis put25_vlak_1_spoo – waywer