自然加入 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_name
在 Companies
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;
如果我有两个主键连接的表,即两个列具有相同的名称和相同的数据,然后我有一个列名时间戳,两个表的名称相同但数据根据它们的表不同.我还能使用 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_name
在 Companies
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;