2016-11-23 3 views
0

Ich habe 3 Tabelle: CD, Song und Song_Details, die eine Beziehung zwischen CD & Song:MySQL Fremdschlüssel Ausgabe

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

Ich habe, um herauszufinden, geschaffen, dass diese Linie in Song_Details:

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

Könnte jemand mir helfen, basierend auf m zu sehen y Tabelle, was könnte dieses Problem verursachen?

+0

Lesen Sie die Antworten in http://stackoverflow.com/questions/15534977/mysql-cannot-add-foreign-key-constraint für Tipps zur Problembehandlung. –

+0

In der referenzierten Tabelle kann kein Index gefunden werden, in dem die referenzierten Spalten als erste Spalten angezeigt werden, oder die Spaltentypen in der Tabelle und die referenzierte Tabelle stimmen nicht mit der Einschränkung überein. – barudo

Antwort

0

Zwei Dinge. Der Schlüssel auto_increment wäre normalerweise der Fremdschlüssel. Zweitens müssen Sie Ihre Referenz auf alle die Schlüssel, die als primäre oder eindeutige Schlüssel für die Tabelle definiert sind (ich rate nicht, Fremdschlüssel Verweise auf nicht eindeutigen Schlüsseln machen, obwohl MySQL all das tut).

So:

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

Hinweise:

  • Verwenden Sie die Primärschlüsselbeziehungen für die Fremdschlüsseldefinitionen.
  • Ich mag es, dass die Primärschlüssel den Tabellennamen enthalten. Auf diese Weise kann der Primärschlüssel den gleichen Namen wie die entsprechenden Fremdschlüssel haben.
  • Legen Sie die Titel nicht an mehr als einem Ort. Sie gehören in die Entitätstabellen. Automatisch inkrementierte IDs können dann verwendet werden, um auf die Titel zuzugreifen.
+0

Oft sind Titel nicht eindeutig. – Drew

+0

@Drew. . . Wenn sie nicht eindeutig sind, entfernen Sie die Einschränkung. Das ist ein Grund mehr, eine andere Spalte als ID für jede Zeile zu verwenden. –