2014-09-25 3 views
0

Я уже задокументировал это и прочитал об этом другие пользователи, поэтому в моем случае ссылка должна работать нормально: у меня есть несколько таблиц, расширяющих одну таблицу «сущность», ассоциация ", ссылающаяся только на таблицу" entity ". Поэтому я ссылаюсь только на родительскую таблицу, которая владеет каждым другим идентификатором таблицы. Почему я получил следующее?Postgresql наследование и внешний ключ, ссылающийся на родительскую таблицу

ERROR: insert or update on table "association" violates foreign key constraint "association_id1_fkey" 
DETAIL: Key (id1)=(1) is not present in table "entity". 

Вот схема, которую я использую.

CREATE TABLE entity (
    id serial primary key, 
    created_at int, 
    updated_at int, 
    deleted_at int 
); 

CREATE TABLE association (
    id1 int references entity(id) on delete cascade on update cascade, 
    atype varchar, 
    id2 int references entity(id) on delete cascade on update cascade, 
    created_at int, 
    deleted_at int 
); 

CREATE TABLE "user" (
    first_name varchar(255), 
    last_name varchar(255) 
)INHERITS(entity); 

CREATE TABLE "pet" (
    name varchar(255) 
)INHERITS(entity); 

INSERT INTO "user" (first_name) VALUES ('damiano'); 
INSERT INTO "user" (first_name) VALUES ('francesco'); 
INSERT INTO "user" (first_name) VALUES ('romolo'); 

INSERT INTO "pet" (name) VALUES ('baloo'); 
INSERT INTO "pet" (name) VALUES ('micia'); 
INSERT INTO "pet" (name) VALUES ('ioria'); 

INSERT INTO "association" VALUES (1, 'pets', 4, 0, 0); 
INSERT INTO "association" VALUES (1, 'pets', 5, 0, 0); 
INSERT INTO "association" VALUES (2, 'pets', 4, 0, 0); 
INSERT INTO "association" VALUES (2, 'pets', 5, 0, 0); 
INSERT INTO "association" VALUES (3, 'pets', 6, 0, 0); 

Ряды правильно вставить:

testing=# select * from "entity"; 
id | created_at | updated_at | deleted_at 
----+------------+------------+------------ 
    1 |   |   |   
    2 |   |   |   
    3 |   |   |   
    4 |   |   |   
    5 |   |   |   
    6 |   |   |   
(6 rows) 

testing=# select * from "user"; 
id | created_at | updated_at | deleted_at | first_name | last_name 
----+------------+------------+------------+------------+----------- 
    1 |   |   |   | damiano | 
    2 |   |   |   | francesco | 
    3 |   |   |   | romolo  | 
(3 rows) 

testing=# select * from "pet"; 
id | created_at | updated_at | deleted_at | name 
----+------------+------------+------------+------- 
    4 |   |   |   | baloo 
    5 |   |   |   | micia 
    6 |   |   |   | ioria 
(3 rows) 

testing=# 
+0

таблица сущностей имеет запись? – Sathish

+0

да, обновляя мой вопрос, чтобы включить статистику выбора –

+0

, вам нужно пройти через http://www.postgresql.org/docs/9.3/static/tutorial-fk.html –

ответ

0

Родительская таблица не содержат все данные из унаследованных таблиц. Выбор из этой таблицы имеет значение UNION над унаследованными таблицами.

Сравните эти:

SELECT * FROM "entity"; 
SELECT * FROM ONLY "entity"; 

Вот почему наследование не используется больше.

+0

ops! то я не могу делать то, что я пытаюсь сделать правильно? Мне нужно использовать какой-то триггер, чтобы сохранить целостность? –

+0

Я бы просто избегал наследования вообще, если вы (1) не потратили время, чтобы полностью понять его, и (2) иметь веские основания предпочесть его стандартной практике отношений. Его можно использовать эффективно, но не часто. –

Смежные вопросы