首页 文章

MySQL外键/自然连接

提问于
浏览
0

Scenario:

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

Problem:

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

The select code with natural join (doesn't work):

SELECT * FROM 
Artists NATURAL JOIN Albums;

The select code with normal join where (does work):

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

DLL for the two tables

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)
);

在此先感谢任何帮助:)

[SOLVED]:

我认为自然连接使用外键来连接表,但它使用所有匹配的列名,包括列“ name ”(两个表中的exsists),因为在数据库中没有任何艺术家具有同名专辑 Headers 结果是0行 . 解决方案是使用

SELECT * FROM 
Artists JOIN albums USING(ar_id);

2 回答

  • 0

    来自documentation

    两个表的NATURAL [LEFT] JOIN被定义为在语义上等效于INNER JOIN或LEFT JOIN,其中USING子句命名两个表中存在的所有列 .

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

    您可以使用连接 FROM Artists JOIN albums USING (ar_id) .

  • 0

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

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

相关问题