2014-01-09 73 views
0

林開發PHP中的數據庫,我有以下兩個表格 成員表的表:MySQL的PHP​​創建包含外鍵只(錯誤150)

 $sql_query = "CREATE TABLE Member(
        ID    INT(8)   NOT NULL AUTO_INCREMENT, 
        Branch_ID  INT(8)   NOT NULL, 
        Join_Date  DATE   NOT NULL, 
        PRIMARY KEY(ID), 
        FOREIGN KEY (Branch_ID) REFERENCES Office(ID) 
        ON DELETE CASCADE ON UPDATE CASCADE)ENGINE = INNODB"; 

和一張桌子事件:

 $sql_query = "CREATE TABLE Event(
        Name  CHAR(30)  NOT NULL, 
        Date  DATE   NOT NULL, 
        Branch_ID INT(8)   NOT NULL, 
        Description VARCHAR(50)  NOT NULL, 
        PRIMARY KEY(Name, Date), 
        UNIQUE KEY (Event_Name, Event_Date), 
        FOREIGN KEY (Branch_ID) REFERENCES Office(ID) 
        ON DELETE CASCADE ON UPDATE CASCADE)ENGINE = INNODB"; 

最後,跟蹤哪個成員才能參加的事件,我有一個表Attends_Event:

$sql_query = "CREATE TABLE Attends_Event(
        Event_Name CHAR(30) NOT NULL, 
        Event_Date DATE  NOT NULL, 
        Attendee_ID INT(8)  NOT NULL, 
        PRIMARY KEY (Event_Name, Event_Date), 
        INDEX Event_Name_Index (Event_Name), 
        INDEX Event_Date_Index (Event_Date), 
        FOREIGN KEY (Event_Name) REFERENCES Event(Name) 
        ON DELETE CASCADE ON UPDATE CASCADE, 
        FOREIGN KEY (Event_Date) REFERENCES Event(Date) 
        ON DELETE CASCADE ON UPDATE CASCADE, 
        FOREIGN KEY (Attendee_ID)REFERENCES Member(ID) 
        ON DELETE CASCADE ON UPDATE CASCADE)ENGINE = INNODB"; 

但是這張桌子從未被創造(Errno 150)。我看過其他類似的問題,似乎我有正確的代碼。我錯過了什麼?

回答

1

我相信你的問題是,你要創建的事件名稱和日期兩個獨立的外鍵,不能因提出相關的完整性約束工作Event表(即,NameDate是主鍵的一部分)。相反,您需要一個包含列的外鍵,列號爲。試用Attends_Event如下:

CREATE TABLE Attends_Event(
    Event_Name CHAR(30) NOT NULL, 
    Event_Date DATE  NOT NULL, 
    Attendee_ID INT(8)  NOT NULL, 
    PRIMARY KEY (Event_Name, Event_Date), 
    INDEX Event_Name_Index (Event_Name), 
    INDEX Event_Date_Index (Event_Date), 
    FOREIGN KEY (Event_Name, Event_Date) REFERENCES Event(Name, Date) 
    ON DELETE CASCADE ON UPDATE CASCADE, 
    FOREIGN KEY (Attendee_ID) REFERENCES Member(ID) 
    ON DELETE CASCADE ON UPDATE CASCADE) ENGINE = INNODB 

順便說一句,在UNIQUE KEY (Event_Name, Event_Date)Event表將不執行,因爲Event_NameEvent_Date沒有在表中的列。然而更重要的是,這個額外的密鑰是完全多餘的,因爲NameDate構成了主鍵,根據定義它是唯一的。另外,我建議在創建Attends_Event表中的兩個普通索引之前進行一些查詢分析。您可能實際上需要一個涵蓋Event_NameEvent_Date的組合索引,但實際上可能並不需要,因爲它們已經是主鍵的一部分。

作爲最後一邊,請檢查Attends_Event表格後面的建模邏輯。就目前而言,由於主鍵約束,您將永遠只能分配一個Attendee_ID到事件。如果你正在尋找多對多的關係(我相信你真的想要),那麼將Attendee_ID包含到主鍵中,你應該全部設置好。

+0

好點。我還要補充一點,在自動遞增整數列形式的'Event'上的代理PK可能是一個更好的主意,因爲這會讓你在'Attends_Event'中引用更短的參考。但是,這主要是我在SQL Server中所做的,我不確定這一點是否與MySQL有任何關聯。 –

+0

謝謝,單個外鍵而不是兩個是導致問題的原因。 – user3178645

+0

此外,您正確使用Attendee_ID而不是事件名稱和日期。這是我的設計缺陷。最糟糕的是,邏輯是正確的,我編錯了! – user3178645

0

你缺少一個空間:

FOREIGN KEY (Attendee_ID)REFERENCES Member(ID) 
-- change to -- 
FOREIGN KEY (Attendee_ID) REFERENCES Member(ID)