2014-09-26 55 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"();