我在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
)。我看过其他类似的问题,似乎我有正确的代码。我错过了什么?
答案 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)
将不会执行,因为Event
和Event_Name
不是该表中的列。但更重要的是,这个额外的密钥完全是多余的,因为Event_Date
和Name
组成了主键,根据定义,它是唯一的。
另外,我建议在Date
表中创建两个普通索引之前进行一些查询分析。您可能实际上想要一个涵盖Attends_Event
和Event_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)