2016-11-23 65 views
0

我有3個表:CDSongSong_Details這是CD & Song之間的關係:MySQL的外鍵問題

create table Song(
    ID int not null auto_increment, 
    Title varchar(255) not null, 
    Length float not null, 
    primary key (ID, Title) 
); 

create table CD(
    Title varchar(255) not null, 
    CD_Number int not null, 
    primary key (Title, CD_Number) 
); 

Create table Song_Details(
    CD_Title varchar(255) not null, 
    Song_Title varchar(255) not null, 
    Track_Number int not null, 
    primary key(CD_Title, Song_Title), 
    foreign key(CD_Title) references CD(Title), 
    foreign key(Song_Title) references Song(Title) 
); 

我設法找到了這條線在Song_Details

foreign key(Song_Title) references Song(Title)是拋Error 1215(HY000): Cannot add foreign key constraint;

任何人都可以幫助我看到基於米Ÿ表,可能會導致此問題?

+0

請閱讀http://stackoverflow.com/questions/15534977/mysql-cannot-add-foreign-key-constraint中的答案以獲取故障診斷提示。 –

+0

在參考表中找不到索引,其中 引用列顯示爲第一列,或表中的列類型 與引用的表不匹配約束。 – barudo

回答

0

兩件事。密鑰auto_increment通常是外鍵。其次,你需要引用全部作爲表的主鍵或唯一鍵的鍵(我不建議對外鍵引用非唯一鍵,儘管MySQL會這麼做)。

所以:

create table Song (
    Song_ID int not null auto_increment, 
    Title varchar(255) not null, 
    Length float not null, 
    primary key (ID), 
    unique (title) 
); 


create table CD (
    CD_Id int auto_increment primary key, 
    Title varchar(255) not null, 
    CD_Number int not null, 
    unique (Title, CD_Number) 
); 


Create table Song_Details(
    CD_ID varchar(255) not null, 
    Song_Id varchar(255) not null, 
    Track_Number int not null, 
    primary key(CD_ID, Song_ID), 
    foreign key(CD_ID) references CD(CD_ID), 
    foreign key(Song_ID) references Song(Song_ID) 
); 

注:

  • 使用外鍵定義主鍵關係。
  • 我喜歡讓主鍵包含表名。這樣,主鍵可以與相應的外鍵具有相同的名稱。
  • 不要把標題放在多個地方。它們屬於實體表格。然後可以使用Autoincremented ID來訪問標題。
+0

通常標題不是唯一的。 – Drew

+0

@德魯。 。 。如果它們不是唯一的,則刪除約束。這是更多的理由使用另一列作爲每行的ID。 –