外键约束是否需要将NOT EQUAL包含在兄弟外键中?

时间:2013-11-25 14:23:28

标签: sql postgresql

我是SQL和Postgresql的新手。我想更好地理解外键约束如何与父表的主键一起使用。

这是我目前为两张桌子设置的。我试图模仿ISA关系,其中echecks IS-A付款。

Table "public.payments"
Column |         Type          |                       Modifiers                        

pid    | integer               | not null default nextval('payments_pid_seq'::regclass)
street | character varying(80) | 
zip    | integer               | 
Indexes:
"payments_pkey" PRIMARY KEY, btree (pid)
Referenced by:
    TABLE "cards" CONSTRAINT "cards_pid_fkey" FOREIGN KEY (pid) REFERENCES payments(pid)
    TABLE "echecks" CONSTRAINT "echecks_pid_fkey" FOREIGN KEY (pid) REFERENCES payments(pid)


Table "public.echecks"
  Column   |         Type          | Modifiers 

rtgacctnum | bigint                | 
accttype   | character varying(80) | 
nameonacct | character varying(80) | 
pid        | integer               | not null default nextval('payments_pid_seq'::regclass)
Foreign-key constraints:
    "echecks_pid_fkey" FOREIGN KEY (pid) REFERENCES payments(pid)


Table "public.cards"
  Column   |         Type          |                      Modifiers                      
pid        | integer               | not null default nextval('cards_pid_seq'::regclass)
cnum       | bigint                | 
nameoncard | character varying(80) | 
Foreign-key constraints:
"cards_pid_fkey" FOREIGN KEY (pid) REFERENCES payments(pid)

使用此当前设置,我无法阻止Echecks和Cards从付款继承相同的pid。我希望Echecks使用Payments中的下一个可用pid号码,在卡片中不是同一个pid。

我希望发生的简化版本:

Payments(pid, pay_type):
1, paypal
2, echeck
3, credit card
4, echeck

Echecks(fk_pid, acct_name)
2, susy
4, bob

Cards(fk_pid, card_name)
3, john

相反,Echecks只是在插入时分配:

1, susy
2, bob

卡片分配:

1, john

设置外键约束的最佳方法是什么,以确保从Payments分配一个唯一的pid?

1 个答案:

答案 0 :(得分:1)

Echecks并没有“抓住”任何价值。您应该在其中插入要在其中显示的值。所以你真正的问题在于你没有在帖子中包含的插入逻辑。