在非主键或唯一键上创建外键约束

时间:2020-01-27 10:39:49

标签: sql postgresql foreign-keys

如何在非主键上使用外键约束?

例如,我有两个表accounttransactions。我想检查表acname中的transactions是表acnameaccount之一。

table account (acno, acname, bal, type)
table transactions (tid, acno, acname, bal, credit/debit, datetime)

此处transactions.acname等于account.acname

请参见以下图表以获取帮助:

enter image description here

1 个答案:

答案 0 :(得分:1)

修复您的数据模型!

也就是说,不要在两个表中同时存储acnoacname。而是将acno存储在accounts中。

然后,当您需要名称时,使用join

select t.*, a.acname
from transactions t join
     accounts a
     on t.acno = a.acno

基本规则是您希望将外键约束链接到参考表的主键(尽管大多数数据库允许它们使用唯一键)。并且,您不想在表之间重复数据。

尽管MySQL允许您定义对非主键的外键引用,但没有理由这样做。