【问题标题】:Why is it necessary to explicitly specify the foreign keys when joining tables in SQL?为什么在 SQL 中连接表时需要显式指定外键?
【发布时间】:2019-06-18 20:11:19
【问题描述】:

SQL Server 知道基于外键的表依赖关系,那么为什么需要显式指定JOIN ON 外键呢?

真实世界的工作示例(此查询有效):

SELECT * FROM users
INNER JOIN roles ON users.role_id=roles.id

隐式示例(此查询不起作用):

SELECT * FROM users
INNER JOIN roles

SQL 不应该隐式且正确地假设如果没有指定 ON 关键字,则应该在外键上进行连接?

我知道这样做的好处可能微不足道,但是在使用 SQL API(例如 Java Hibernate 的查询语言)中的此功能后,我不明白为什么不将其内置到 SQL 中。


编辑

感谢到目前为止的回答。尽管它们很有趣,但它们都没有回答有关 SQL Server 的原始问题。

【问题讨论】:

    标签: sql sql-server hibernate


    【解决方案1】:

    SQL 确实支持这个概念。该标准包括natural join,SQL Server 很高兴没有实现。这使您可以:

    SELECT *
    FROM users u NATURAL JOIN
         roles r;
    

    natural join 没有 on 子句。

    唉,它的作用与您的建议略有不同。它不使用外键,而是使用具有相同名称的列。我认为这是可恶的,因为 SQL 确实有明确的外键声明,这将是使用它们的正确位置。

    【讨论】:

    • 哇...不知道 SQL Server 没有实现自然连接,因为我自己不使用它们,我认为这是 SQL Server 的功能 .
    • Postgres 支持USING (col1, col2, col3,..) 语法,这使得连接列的名称明确,尽管它要求两个表中的名称相同。这比写出完整的 equi-join 语法要简洁一些。
    【解决方案2】:

    表之间有多个外键关系是很正常的。

    在这种情况下,当两个表之间有两个 FK 时,您希望数据库做什么。随便选一个?

    典型示例:

    • 一张桌子CLIENT
    • 一张表PURCHASE。由于购买发生在两个客户之间,因此需要两个指向 CLIENT 的 FK:seller_idbuyer_id,两者都指向 CLIENT

    【讨论】:

    • 有趣。在这种情况下,也许您可​​以指定要使用的外键约束的名称。如果条件明确,那将是可选的。
    • 但请注意,SQL Server 不允许创建导致两个表之间存在多个路径的外键,因为在这种情况下它无法进行级联更新和删除。要获得该功能,您需要使用 Postgres、SQLite 或 Firebird。
    • @rd_nielsen 您能否详细说明“多种途径”?我一直在 SQL Server 中进行测试,似乎它允许相当多的外键选项。见:sqlfiddle.com/#!18/a5467b/2
    • @TheImpaler - 级联更新或删除时无法创建多个路径。尝试将 on update cascade on delete cascade 添加到 SQL Fiddle 中的外键声明中。这记录在docs.microsoft.com/en-us/previous-versions/sql/…;请参阅“多个级联操作”部分。该文档来自 2012 年,但仍然适用。另请参阅splinterofthesingularity.blogspot.com/2011/04/… 了解更多详情
    • @rd_nielsen 谢谢,及时注明。
    【解决方案3】:

    每次发生隐式操作时,都很难完全按照您的意愿行事。一开始,自然连接似乎很快,但如果你必须调试它,那么你必须弄清楚连接是如何工作的。是使用外键吗?它只是具有相同名称的列吗?我现在正在使用 NHIBERNATE,似乎我团队中的每个人都很难用它来做需要做的事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 1970-01-01
      • 2011-02-16
      • 2015-03-23
      • 1970-01-01
      相关资源
      最近更新 更多