MySQL php创建一个只包含外键的表(错误150)

时间:2014-01-09 18:07:51

标签: mysql sql foreign-keys

我在php中开发数据库,​​我有以下两个表 成员表:

$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)。我看过其他类似的问题,似乎我有正确的代码。我错过了什么?

2 个答案:

答案 0 :(得分:1)

我相信您的问题是您正在尝试在事件名称和日期上创建两个单独的外键,由于Event表中提出的关系完整性约束(即{{1} }和Name是主键的一部分)。相反,您需要一个包含两个列的外键。请尝试以下Date

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)将不会执行,因为EventEvent_Name不是该表中的列。但更重要的是,这个额外的密钥完全是多余的,因为Event_DateName组成了主键,根据定义,它是唯一的。

另外,我建议在Date表中创建两个普通索引之前进行一些查询分析。您可能实际上想要一个涵盖Attends_EventEvent_Name的复合索引,但实际上这可能不是必需的,因为它们已经是主键的一部分。

最后,请检查Event_Date表后面的建模逻辑。就目前而言,由于主键约束,您只能为事件分配一个Attends_Event。如果您正在寻找多对多关系(我相信您确实需要),那么请将Attendee_ID包含在主键中,您应该全部设置。

答案 1 :(得分:0)

你错过了一个空格:

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