我对mysql中的自然连接感到有点困惑。
假设:有两个表
table1
有列:id, name, address, number (id is the PK of table1)
table2
有列:id, name, number, money (id is the PK of table2)
我已经"id"
table1
个外键,引用了"id"
的{{1}}
并假设table2
中的"number"
为table1
且"people's number"
中的"number"
为table2
,这两列具有不同的含义,但名称相同< / p>
当我执行"telephone number"
和table1
的自然联接时:
mysql是否只是简单地检查table2
和table1
的所有列,其名称相同,这意味着将选择元组(行),当且仅当{{1} },table2
和"id"
“必须完全相同(例如,"name"
和"number
相同,但"id"
不同,行不会选择的)?
OR
mysql是否只检查创建的外键,这意味着当且仅当"name"
相同时才会选择一行?
另一个问题是:
自然加入"number"
和"id"
后,只会有一列名为table1
或列为table2
和"id"
吗?
非常感谢!
答案 0 :(得分:0)
你不应该使用自然连接,你可能需要使用左连接。 table1是父表?至少听起来应该是这样,外键引用应该从父表中插入子表中。父表每个引用id有一个条目,子表可能有多个,一个或没有引用id的条目
SELECT table1.id, table1.number AS person_number, table2.number AS phone_number
FROM table1
LEFT JOIN table2 ON table1.id = table2.id
答案 1 :(得分:0)
只读取数据的查询将始终提供相同的结果,无论外键如何。
来自JOIN manual:
两个表的NATURAL [LEFT] JOIN被定义为在语义上等同于INNER JOIN或LEFT JOIN,其中USING子句命名两个表中存在的所有列。
如果SELECT *
,NATURAL JOIN中使用的列将仅在结果集中出现一次。
所以,在你的情况下:
SELECT * FROM table1 NATURAL JOIN table2
将成为:
SELECT table1.id, table1.name, table1.number, table1.address, table2.money
FROM table1
JOIN table2 ON table2.id = table1.id
AND table2.name = table1.name
AND table2.number = table1.number
列的顺序将是proba