2016-11-23 4 views
0

私が持っている3表:CD & Song間の関係があるCDSongSong_Details:私はそれを見つけるために管理している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;

私はmに基づいて参照することができますか?この問題の原因は何でしょうか?

+0

トラブルシューティングのヒントについては、http://stackoverflow.com/questions/15534977/mysql-cannot-add-foreign-key-constraintをご覧ください。 –

+0

参照された列が最初の列として表示されるか、または表の列の種類が であり、参照先の表が制約のために一致しない参照された表内の索引を見つけることができません。 – barudo

答えて

0

2つのもの。 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) 
); 

注:

  • 外部キー定義のプライマリキーの関係を使用してください。
  • 私は、主キーにテーブル名を含めるのが好きです。このようにして、主キーは対応する外部キーと同じ名前を持つことができます。
  • タイトルを複数の場所に入れないでください。それらはエンティティテーブルに属します。自動インクリメントIDを使用してタイトルにアクセスできます。
+0

タイトルは一意ではないことがよくあります。 – Drew

+0

@Drew。 。 。それらが一意でない場合は、制約を削除します。これは、各行のIDとして別の列を使用する理由です。 –