2015-11-23 2 views
0

им с этой ошибкой:PostgreSQL ошибка ограничения

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

Это мой код, чтобы сделать внешний ключ:

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

таблицы сделаны таким образом:

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 прочитайте эти потоки в stackoverflow, но я не совсем понимаю, что они говорят:

PostgreSQL constraint problems

Postgresql constraint

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

Я надеюсь, что кто-то может помочь мне. Im очень новый для postgres и не совсем понимаю, как работают внешние ключи.

Приветствие

ответ

0

On (ссылка) таблиц vulling вам нужно иметь значения стоимости создания эксклюзивных ваш внешний ключа. Но вы этого не сделаете. У вас есть уникальные значения для триплета (vulling, put, spoor), который не означает единичную пару пары (spoor, vulling).

Рассмотрим

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

То два ряда с точки зрения стоимость создания эксклюзивной триплетных, но не в виде пары vulling и spoor. В конце вы должны либо добавить UNIQUE(vulling, spoor) в определение таблицы, либо управлять отношением «многие ко многим», используя вспомогательную таблицу.

В качестве альтернативы вы можете реверс тэ внешнего ключа DEF:

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

я также, хотя это и я поиск с этим SQL: выберите Spoor, vulling из vulling группы по Spoor, vulling , имеющему COUNT (*)> 1 и выберите след, vulling из put_25_vlak_1_spoor группы по Spoor, vulling , имеющий подсчета (*)> 1 , но не было двойных записей. У меня есть несколько двойных, если я только обманываю. Может быть, проблема? – waywer

+0

Речь идет не только о непубликации, а о том, чтобы ** ** не допускать ** дублирования. Вы понимаете это, определяя уникальное ограничение для пары каланов. –

+0

Я сделал оба столбца первичными ключами. Таким образом, нет дублирования (по крайней мере, я так и думал). Если я сделаю его уникальным в столбце, я не могу сделать что-то вроде этого: spoor = 10 vulling = 1 и spoor = 10 и vulling = 2.Но я хочу сделать это в своей базе данных – waywer

0

ли у вас есть данные в таблице vulling? Вы не можете добавить данные в put_25_vlak_1_spoor, если в обмане не существует одинаковых данных в строках, обманывающих.

т.е. если вы хотите добавить в put_25_vlak_1_spoor запись, где выслеживать = 111 и vulling = 222, в vulling должны быть строки, где выслеживать = 111 и vulling = 222

+0

Я проверил его, и действительно было две записи, которые существовали в put25_vlak_1_spoor, которые не существовали в обмане. Я добавил их к столу. Но у меня все еще такая же ошибка. пс. У меня было больше записей в vulling, а затем put25_vlak_1_spoo – waywer