2

我目前有一个父表:

CREATE TABLE members (
    member_id SERIAL NOT NULL, UNIQUE, PRIMARY KEY
    first_name varchar(20)
    last_name varchar(20)
    address address (composite type)
    contact_numbers varchar(11)[3]
    date_joined date
    type varchar(5)
);

和两个相关的表:

CREATE TABLE basic_member (
    activities varchar[3]) // can only have 3 max activites
    INHERITS (members)
);

CREATE TABLE full_member ( 
    activities varchar[]) // can 0 to many activities
    INHERITS (members)
);

我还有另一张桌子:

CREATE TABLE planner (
        day varchar(9) FOREIGN KEY REFERENCES days(day)
        time varchar(5) FOREIGN KEY REFERENCES times(time)
        activity varchar(20) FOREIGN KEY REFERENCES activities(activity)
        member bigint FOREIGN KEY REFERENCES members(member_id)
);
ALTER TABLE planner ADD CONSTRAINT pk_planner PRIMARKY KEY (day,time,activity,member);

我目前正在尝试添加

INSERT INTO planner VALUES ('monday','09:00','Weights',2);

我在 full_members 中添加了一个集合

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', (12,'Forest Road','Mansfield','Nottinghamshire','NG219DX'),'{01623485764,07789485763,01645586754}',20120418,'Full');

我在 Planner 中的插入目前无法正常工作——你能解释一下原因吗?

4

4 回答 4

2

我设法回答了我自己的问题,这是因为目前 posgreSQL 不能很好地处理继承和外键,所以我没有创建规则

CREATE RULE member_ref
AS ON INSERT TO planner
WHERE new.member NOT IN (SELECT member_id FROM members)
DO INSTEAD NOTHING;

这与外键基本相同

于 2012-04-21T11:24:57.653 回答
1

不确定这是否会是更好的解决方案,但它就在这里......

原理很简单:

  • 创建新表让我们调用它table_with_pkeys,它将复制继承表的主键列child1child2...child3
  • 在继承的表上创建触发器,插入后,将新的 PK 插入到table_with_pkeys新创建的 PK 中,更新后如果更改更新它,删除后从 table_with_pkeys 中删除相同的 PK。
  • 然后在每个应该使用 FK 引用 child1、child2 或通过父表的 PK 的任何表中,将 FK 指向不是父表的 PK,而是指向 table_with_pkeys,它具有所有子 PK 的副本,因此您将拥有易于管理的方式来拥有外键可以级联更新,限制更新等等。

希望能帮助到你。

于 2012-09-18T08:14:31.930 回答
0

如果上述物化视图方法对您不起作用,请创建约束触发器以检查参照完整性。不幸的是,声明性引用完整性目前不适用于继承。

于 2012-09-24T07:05:21.210 回答
0

您在地址中的 12 之前缺少一个公开报价:

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', (12 Forest Road', 'Mansfield', 'Nottinghamshire', 'NG219DX'),
        '{01623485764,07789485763,01645586754}',20120418,'Full');

应该:

INSERT INTO full_members 
VALUES (Default, 'Hayley', 'Sargent', ('12 Forest Road', 'Mansfield', 'Nottinghamshire', 'NG219DX'),
        '{01623485764,07789485763,01645586754}',20120418,'Full');
于 2012-04-20T20:22:58.513 回答