gpt4 book ai didi

MySQL php 创建仅包含外键的表(错误 150)

转载 作者:行者123 更新时间:2023-11-29 13:19:40 25 4
gpt4 key购买 nike

我正在用 php 开发数据库,​​我有以下两个表成员(member)表:

$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";

最后,为了跟踪哪些成员参加哪些事件,我有一个表 attend_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)。我看过其他类似的问题,似乎我有正确的代码。我缺少什么?

最佳答案

我相信您的问题是您正在尝试在事件名称和日期上创建两个单独的外键,由于 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

顺便说一句,自 Event_NameEvent_Date 起,Event 表中的 UNIQUE KEY (Event_Name, Event_Date) 将不会执行 不是该表中的列。然而,更重要的是,这个额外的键完全是多余的,因为 NameDate 构成主键,根据定义,主键是唯一的。

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

最后,请检查 Attends_Event 表背后的建模逻辑。按照目前的情况,由于主键限制,您只能将一个 Attendee_ID 分配给一个事件。如果您正在寻找多对多关系(我相信您确实想要这种关系),请将 Attendee_ID 包含到主键中,这样就一切就绪了。

关于MySQL php 创建仅包含外键的表(错误 150),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21027878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com