当有外键时提供 JOIN 条件有什么意义?
What is the point of providing a JOIN condition when there are foreign keys?
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
条件的所有必要信息;但我们仍然必须添加它。这是为什么?
- 为此,您必须考虑 JOIN 操作。它不会检查您的两个 table 或集合是否有关系。因此,简单的无条件连接 (ON) 您将获得各种可能性的大结果。
- ON 操作过滤以获得预期结果
JOIN条件是一个表达式,它指定了加工条件,在JOIN过程中被检查。只有在出现语法错误时才会导致失败。
FOREIGN KEY是数据一致性检查子系统的规则,在数据变化时进行检查。如果数据状态(中间 and/or 最终)与规则不匹配,将导致失败。
换句话说,它们之间没有任何共同点,完全不同,毫无关联。
I feel like I have to reiterate parts of the question. Please, give it a second read - 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
.
加入条件必须使用什么参考?并证明你的假设...
重新发布 Damien_The_Unbeliever's comment 作为答案
- 您不必加入外键;
- 有时同一对表之间存在多个外键。
此外,SQL 是一种粗鲁的语言,对于最常见的用例没有很多捷径。
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
条件的所有必要信息;但我们仍然必须添加它。这是为什么?
- 为此,您必须考虑 JOIN 操作。它不会检查您的两个 table 或集合是否有关系。因此,简单的无条件连接 (ON) 您将获得各种可能性的大结果。
- ON 操作过滤以获得预期结果
JOIN条件是一个表达式,它指定了加工条件,在JOIN过程中被检查。只有在出现语法错误时才会导致失败。
FOREIGN KEY是数据一致性检查子系统的规则,在数据变化时进行检查。如果数据状态(中间 and/or 最终)与规则不匹配,将导致失败。
换句话说,它们之间没有任何共同点,完全不同,毫无关联。
I feel like I have to reiterate parts of the question. Please, give it a second read - 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
.
加入条件必须使用什么参考?并证明你的假设...
重新发布 Damien_The_Unbeliever's comment 作为答案
- 您不必加入外键;
- 有时同一对表之间存在多个外键。
此外,SQL 是一种粗鲁的语言,对于最常见的用例没有很多捷径。