【问题标题】:What is the point of providing a JOIN condition when there are foreign keys?当有外键时提供 JOIN 条件有什么意义?
【发布时间】:2022-01-23 01:42:10
【问题描述】:

TL;DR:为什么我们必须添加ON table1.column = table2.column


This question 粗略地询问如果没有外键加入也可以正常工作,为什么我们需要外键。在这里,我想反问。给定最简单的数据库,如下所示:

CREATE TABLE class (
  class_id INT PRIMARY KEY,
  class_name VARCHAR(40)
);
CREATE TABLE student (
  student_id INT PRIMARY KEY,
  student_name VARCHAR(40),
  class_id INT,
  FOREIGN KEY(class_id) REFERENCES class(class_id) ON DELETE SET NULL
);

…和一个简单的连接,像这样:

SELECT student_id, student_name, class_name
FROM student
JOIN class
ON student.class_id = class.class_id;

...为什么我们不能省略 ON 子句?

SELECT student_id, student_name, class_name
FROM student
JOIN class;

对我来说,student 定义中的FOREIGN KEY(class_id) REFERENCES class(class_id) … 行已经包含FROM student JOIN class 具有隐式ON student.class_id = class.class_id 条件的所有必要信息;但我们仍然必须添加它。这是为什么呢?

【问题讨论】:

  • a)您没有必须加入 FK 和 b) 有时同一对表之间存在多个 FK。 c) SQL 是一种硬朗的语言,对于最常见的用例没有很多快捷方式
  • 别偷懒,指定join条件! (这也意味着避免 NATURAL JOIN。)

标签: mysql sql join foreign-keys


【解决方案1】:

JOIN 条件是一个指定匹配条件的表达式,它在 JOIN 过程中被检查。只有出现语法错误才会导致失败。

FOREIGN KEY 是数据一致性检查子系统的规则,在数据变化时进行检查。如果数据状态(中间和/或最终)与规则不匹配,则会导致失败。

也就是说,它们之间没有任何共同点,它们是完全不同且不相关的东西。


我觉得我必须重申部分问题。请再读一遍 - Dima Parzhitsky

假设您的报价被接受。我有桌子:

CREATE TABLE users (userid INT PRIMARY KEY);
CREATE TABLE messages (sender INT REFERENCES users (userid), 
                       receiver INT REFERENCES users (userid));

我写SELECT * FROM users JOIN messages

加入条件必须使用什么参考?并证明你的假设......

【讨论】:

  • JOIN 条件也可能由于许多其他原因而失败。
  • 好吧,我并不是说它们是一回事;我是说加入时使用外键信息会有所帮助
  • @DimaParzhitsky 想象一下,某些特定查询的连接逻辑需要使用与 FK 表达式不同的连接条件...... PS。在 MySQL 中允许不带 ON 子句的 JOIN(这是一个扩展)并且是 CROSS JOIN 的别名。
  • 我完全明白我所询问的隐式条件不适合 100% 的 JOIN 情况(SQL JOIN 因其复杂程度而臭名昭著);我的问题更多的是“为什么在这种特殊的非常常见和明显的情况下不允许它?”。您的回答在知识方面绝对有用,但 Damien 的评论(第一个)在回答这个问题方面做得更好。
  • @DimaParzhitsky 服务器无法理解特殊/特殊情况 - 它需要一个匹配 100% 查询的规则。
【解决方案2】:

转帖Damien_The_Unbeliever's comment作为答案

  • 您不必加入外键;
  • 有时同一对表之间存在多个外键。

此外,SQL 是一种粗俗的语言,对于最常见的用例没有很多快捷方式。

【讨论】:

    【解决方案3】:
    • 为此,您必须考虑 JOIN 操作。它不会检查您的两个表或集合是否有关系。因此,简单的无条件连接 (ON) 您将获得具有所有可能性的大结果。
    • ON 操作过滤以获得预期结果

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 2013-12-25
      • 2011-05-14
      • 2012-03-04
      • 1970-01-01
      • 2012-04-28
      相关资源
      最近更新 更多