MySQL外键/自然连接

时间:2016-03-07 18:46:27

标签: mysql

情境:

我一直试图解决一个问题,我希望在两个表艺术家和专辑之间进行自然连接,其中艺术家组成一个列ar_id是主键,而专辑包含一列也是名为ar_id,其中Album表中的外键是ar_id,并引用艺术家ar_id。表之间有一对多的关系(一个艺术家可以有多个专辑)。

问题:

当我想在两个表Artists和Albums之间进行NATURAL JOIN时,它会返回0行,但是当我使用WHERE函数时,它是正常的JOIN,它会返回18行。所以我猜问题是外键设置,但我找不到问题

自然加入的选择代码(不起作用):

SELECT * FROM 
Artists NATURAL JOIN Albums;

具有正常联接的选择代码(其中有效)

SELECT * FROM 
Artists JOIN Albums
WHERE CDReg.Artists.ar_id = CDReg.Albums.ar_id;

两个表的DLL

CREATE TABLE Artists (
  ar_id int PRIMARY KEY,
  ge_id int(11) DEFAULT NULL,
  country_code varchar(2) DEFAULT NULL,
  name varchar(45) NOT NULL,
  start_year year(4) DEFAULT NULL,
  end_year year(4) DEFAULT NULL,
  FOREIGN KEY (ge_id) REFERENCES Genres (ge_id),
  FOREIGN KEY (country_code) REFERENCES Countries (code)
);

-- --------------------------------------------------------

CREATE TABLE Albums (
  al_id int PRIMARY KEY,
  ar_id int,
  name varchar(45) NOT NULL,
  release_year year(4) DEFAULT NULL,
  FOREIGN KEY (ar_id) REFERENCES Artists(ar_id)
);

感谢提前的任何帮助:)

[解决]:

我认为自然连接使用外键来连接表,而是使用所有匹配的列名,包括列" name" (两个表中都存在),因为在数据库中没有任何具有同名专辑标题的艺术家,结果是0行。解决方案是使用

SELECT * FROM 
Artists JOIN albums USING(ar_id);

2 个答案:

答案 0 :(得分:0)

来自documentation

  

两个表的NATURAL [LEFT] JOIN被定义为语义   相当于INNER JOIN或带有USING子句的LEFT JOIN   名称两个表中都存在的所有列

这两个表都有一个列document.getElementById('space' + i) ,它包含在自然连接中,除了那些艺术家和专辑名称相同(我猜可能会发生)之外的所有组合都失败。

您可以改为使用加入name

答案 1 :(得分:0)

自然联接可能会在联接中使用name,这会导致0结果,除非艺术家有同名专辑!

无论如何你应该avoid natural join,因为正如你所看到的,它们不太明显。坚持正常的加入版本。