2014-09-25 70 views
0

我已经记录了关于这一点,并阅读其他用户张贴关于这一点,但在我的情况下,引用应该工作正常:我有几个表扩展一个“实体”表和一个“关联“表只引用”实体“表。所以我引用的只是拥有其他表ID的父表。那么我如何得到以下内容?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 2014-09-25 09:17:48

+0

是的,更新我的问题,包括选择统计 – 2014-09-25 09:20:18

+0

你需要通过http://www.postgresql.org/docs/9.3/static/tutorial-fk.html – 2014-09-25 09:46:05

回答

0

父表包含来自继承表中的所有数据。从该表中进行选择会在继承的表上执行UNION

比较这些:

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

这就是为什么继承不使用更多。

+0

ops!那么我不能做我想要做的事情吗?我需要使用一些触发器来保持完整性? – 2014-09-25 09:43:18

+0

我只是完全避免继承,除非你(1)有时间去致力于完全理解它,并且(2)有一个令人信服的理由去偏爱标准的关系实践。它可以有效地使用,但不是经常使用。 – 2014-09-25 09:45:31