Sql 如何区分两张桌子之间的距离?
我有两张看起来非常相似的桌子:Sql 如何区分两张桌子之间的距离?,sql,postgresql,Sql,Postgresql,我有两张看起来非常相似的桌子: 表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 pos
表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
以及:
表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
基本上,只有两个表包含地址,它们用于不同的端口(一个是Customer
address,另一个是Supllier
address)
我需要创建一个第三个表,并有一个forigenkey地址。我的问题是forigenkey可以来自表A
或表B
假设模式为:
table_Cid , id , ......
id应该是表a或表B的FK,但这还不够。。。我无法知道它实际上指的是哪一张表
有一句话是:
table_Cid , id , ......
111 1
哪一行是1
?是表a的1还是表b的1
如何定义表c
来处理此问题?
假设对
表a
或表b
没有任何更改您可以添加列调用“type”来区分FK\U ID与表a或表b。e、 g:type:1(来自表a)sql是:从fkId=table\U a\U id上的表c join table\U a中选择*,其中type=1将外键引用存储在单独的列中,具体取决于它是针对表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
我认为所有地址都有一个公共表。。。那么你只需要一个FK-问题已解决-我特别写道,我无法更改表A和表B的状态。我知道这种方法,我正在寻找其他方法。使用触发器,FK为你工作,在插入/更新和删除时。我不明白你的意思。像这样的问题表明数据库设计可能有问题。这就是我第一句话想告诉你的。。。