据我所知,许多 DBMS(例如 mysql、postgres、mssql)仅使用 fk 和 pk 组合来约束对数据的更改,但它们很少用于自动选择要连接的列(就像自然连接对名称所做的那样)。这是为什么?如果您已经使用 pk/fk 定义了 2 个表之间的关系,为什么数据库无法确定如果我加入这些表,我想将它们加入 pk/fk 列?
编辑:澄清一下:
假设我有一个 table1 和一个 table2。表 1 在 a 列上有一个外键,它引用表 2 上的主键,即 b 列。现在,如果我加入这些表,我将不得不做这样的事情:
SELECT * FROM table1 JOIN table2 ON table1.a = table2.b
但是,我已经使用我的键定义了 table1.a 引用 table2.b,所以在我看来,让 DBMS 系统自动使用 table1.a 和 table2.b 作为连接列应该不难,这样人们就可以简单地使用:
SELECT * FROM table1 AUTO JOIN table2
然而,许多 DBMS 似乎并没有实现这样的东西。
在许多情况下,连接两个表的方法不止一种;有关大量示例,请参见其他答案。当然,可以说在这些情况下使用“自动加入”是错误的。那么就只剩下少数几个可以使用它的简单案例了。
但是,有一个严重的缺点!今天正确的查询明天可能会在同一个表中添加第二个 FK 就变成错误!
让我再说一遍:通过添加列,不使用这些列的查询可能会从“正确”变为“错误”!
这是一个维护噩梦,任何理智的风格指南都会禁止使用此功能。大多数已经select *出于同样的原因禁止!
如果性能得到提高,所有这些都是可以接受的。然而,事实并非如此。
总而言之,这个特性只能在有限的一组简单情况下使用,不会提高性能,而且大多数风格指南无论如何都会禁止它的使用。
因此,大多数数据库供应商选择将时间花在更重要的事情上也就不足为奇了。