自然加入 MySQL 与匹配的列

Natural Join in MySQL with matching columns

如果我有两个主键连接的表,即两个列具有相同的名称和相同的数据,然后我有一个列名时间戳,两个表的名称相同但数据根据它们的表不同.我还能使用 NATURAL JOIN 吗?或者考虑到我需要使用两个表中的 SELECT * 而没有别名,是否有解决方法?

不要使用NATURAL JOIN!这是可憎的。它甚至没有考虑正确声明的外键关系。

您可能会发现 USING 子句很有用:

select . . .
from a join
     b
     using (pk);

NATURAL JOIN 的另一个问题是未列出连接键。如果出现问题,这会使调试代码变得非常困难。您遇到 TIMESTAMP 列的问题。

如果您使用 USING,您可以使用 SELECT *,并且 USING 键在 SELECT 中只出现一次。有时,这可能是一种方便。

有很多修复,可以组合使用:

• 确保每个数据元素名称在其模式中是唯一的。例如,与其依赖 updated_date 属性通过出现在 Companies table 中的上下文来获得意​​义,而是将其命名为 company_name_updated_date.

• 将实体属性和审计属性分成不同的基础 table,例如company_nameCompanies table 和 company_name_updated_date 在 CompaniesAudit table。将它们放在不同的模式中也可能有意义。

• 使用视图进行防御性编码:无论如何,这可能是您应该做的事情。考虑给定的一组用户(用例、应用程序等)应该可以使用哪些属性,创建一组视图来公开这些属性并根据需要授予权限。不要向不需要查看它们的用户公开审计列。

• 在查询中进行防御性编码 ('on the fly'):使用驱动 tables 仅投影查询所需的列,因此如果将新列添加到现有列,则不会该查询的 'breaking change'。例子:

WITH c AS ( SELECT company_id, company_name FROM Companies ),
p AS ( SELECT employee_id, company_name FROM Payroll )
SELECT * FROM c NATURAL JOIN p;