如何在两张桌子之间进行拼写?

时间:2016-02-03 08:22:25

标签: sql postgresql

我有两张看起来非常相似的表:

Table A

table_c_id     address         country    status  defaultA   deafultB 
1               480 st          4          170     True      False
2               271 st          4          150     False     False
3              174 St post 44   3          150     False     False

Table B

table_b_id   address         country    isdefault  canoverwrite  linked
1                              12         True      False         33
48           Kyat St.          17                   True
155          Rover St          17                   True          14

基本上它只是两个包含地址的表,它们用于不同的porupses(假设一个是Customer地址,另一个是Supllier地址)

我需要创建第3个表并且具有forigenkey的地址。我的问题是forigenkey可以来自table Atable B

说模式是:

table_Cid , id , ......

id应该是Table_A或Table_B的FK,但这还不够......我将无法知道它实际上指的是哪一个表。

说一行是:

table_Cid , id , ......
 111         1

哪一行1是?是table_a的1还是table_b的1?

如何定义table_c来处理此问题? 假设table_atable_b无法进行任何更改。

2 个答案:

答案 0 :(得分:0)

您可以添加列调用'type'以区分FK_ID与table_a或table_b。例如:type:1(来自table_a)sql是:select * from table_c join table_a on fkId = table_a_id where type = 1

答案 1 :(得分:0)

将外键引用存储在单独的列中,具体取决于它是表A还是表B.确保只设置其中一个:

create table c (id integer,
                ...
                a_fk integer references A (id),
                b_fk integer references B (id),
                ...
                check (a_fk is null or b_fk is null))

创建一个返回当前FK列的视图,并指示其是否为表A或表B:

create view cv as select id, ...
                         coalesce(a_fk, b_fk) as fk_val,
                         case when a_fk is not null then 'A'
                              when b_fk is not null then 'B'
                         end as fk_tbl,
                         ... 
                  from c