首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在这个查询中真的需要创建外键吗?

在这个查询中真的需要创建外键吗?
EN

Stack Overflow用户
提问于 2015-07-27 05:29:17
回答 1查看 26关注 0票数 0

我有一个名为investors的表,其主键为ID。我还有名为Users、Login_Logs和Accounts的其他表。所有这些表都包含外键investor_id。在投资者和用户之间,我们有一对一的关系。投资者和Login_Logs之间是一对多的关系,投资者和账户之间也是一对多的关系。我的问题是,为了创建一个加载Users,Login_Logs和Accounts表中包含的信息的查询,我需要在Login_Logs表中存储Users id,Accounts id和Users id吗?我的意思是,我需要在投资者表中为所有列创建外键吗?

EN

回答 1

Stack Overflow用户

发布于 2015-07-27 06:28:01

不,外键约束不会影响连接和读取查询。它们确保子列中的值存在于被引用的列中。它们用于完整性,而不是用于链接行或表。

AFAICT在您的投资者表中记录用户id是多余的,并且在投资者中记录帐户和login_log id是不切实际的。

为了能够有效地联接这些表,您需要为每个表中的investor_id建立索引。然后,由您的查询根据需要连接表。

同时检索投资者的所有信息的问题是您有(多个)一对多关系。如果我们连接所有的表:

代码语言:javascript
复制
SELECT *
FROM investors i
JOIN users u ON i.ID = u.investor_id
JOIN accounts a ON i.ID = a.investor_id
JOIN login_logs l ON i.ID = l.investor_id

然后,如果一个投资者有2个帐户和2个login_logs,那么我们将得到4行。SQL数据库无法嵌套相关数据。相反,您可能必须使用3个查询来检索有关投资者的所有信息:

代码语言:javascript
复制
SELECT *
FROM investors i
JOIN users u ON i.ID = u.investor_id

SELECT *
FROM accounts

SELECT *
FROM login_logs

然后在代码中处理结果。您可以通过编程方式处理上面的组合查询,但它有点复杂。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31642162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档