2014-09-26 60 views
0

我在Postgres 9.3数据库中有以下场景:表B和C参考表A;表C具有引用表B的附加可选字段。我想确保对于引用表B的表C的每个行c,c.b.a = c.a.postgres:涉及多个表的外键约束

  • 我可以重构表C,这样如果指定了c.b,c.a就是null,但这会使查询连接表A和C变得尴尬。
  • 我也可以使表B的主键包含对表A的引用,然后使表C的表B的外键包括表C对表A的引用,但是我认为这种调整太不合理,不足以证明其好处。
  • 我认为这可以通过在表C插入/更新之前运行的触发器来完成,并拒绝违反指定约束的操作。

在这种情况下是否有更好的方法来执行数据完整性?

+0

你不得不使用触发器和适当的锁定。 – 2014-09-27 07:06:51

回答

0

我结束了创建触发器如下:

create function "check C.A = C.B.A"() 
returns trigger 
as $$ 
begin 
    if NEW.b is not null then 
     if NEW.a != (select a from B where id = NEW.b) then 
      raise exception 'a != b.a'; 
     end if; 
    end if; 
    return NEW; 
end; 
$$ 
language plpgsql; 

create trigger "ensure C.A = C.B.A" 
before insert or update on C 
for each row 
execute procedure "check C.A = C.B.A"();