为什么我的 mySQL 抛出 "ERROR 1215 (HY000): Cannot add foreign key constraint"
Why is my mySQL throwing "ERROR 1215 (HY000): Cannot add foreign key constraint"
收到错误:
ERROR 1215 (HY000): Cannot add foreign key constraint
代码:
CREATE TABLE servers (
serverID varchar(20) NOT NULL,
serverPrefix varchar(1) NOT NULL,
captchaEnabled boolean NOT NULL,
giveawayEnabled boolean NOT NULL,
pollsEnabled boolean NOT NULL,
reactRolesEnabled boolean NOT NULL,
serverStatsEnabled boolean NOT NULL,
storyTimeEnabled boolean NOT NULL,
suggestionsEnabled boolean NOT NULL,
welcomeEnabled boolean NOT NULL,
captchaChannelID varchar(20),
storyTimeChannelID varchar(20),
suggestionsChannelID varchar(20),
reportChannelID varchar(20),
PRIMARY KEY (serverID)
);
CREATE TABLE welcomeMessage(
welcomeMessageID int NOT NULL AUTO_INCREMENT,
serverID varchar(20) NOT NULL,
`description` varchar(300),
instruction varchar(300),
footer varchar(100),
welcomeChannelID varchar(20),
DM boolean NOT NULL,
PRIMARY KEY (welcomeMessageID),
FOREIGN KEY (`serverID`) REFERENCES servers (`serverID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
在“CREATE TABLE welcomeMessage”上抛出错误。我尝试使用以下方法将创建与外键分开:
ALTER TABLE welcomeMessage ADD FOREIGN KEY (`serverID`) REFERENCES servers(`serverID`);
但是它只是创建 table 然后在“Alter”行上抛出错误。
感谢任何帮助。
问题出在字符集和排序规则上。对于要成为 well-formed 的外键,父列和子列都必须具有相同的字符集和排序规则。第一条语句依赖于默认设置,而第二条语句具有显式设置。如果这些与默认值不同,则会发生故障。
如果我只是注释掉第二个 create table
语句的 charset .... collate ...
部分,您的代码就可以工作,如您所见 in this db fiddle.
两个存储引擎也需要对齐。如果您的数据库使用 MyISAM 作为默认引擎,代码也将不起作用(因为第二条语句明确使用 InnoDB)。
收到错误:
ERROR 1215 (HY000): Cannot add foreign key constraint
代码:
CREATE TABLE servers (
serverID varchar(20) NOT NULL,
serverPrefix varchar(1) NOT NULL,
captchaEnabled boolean NOT NULL,
giveawayEnabled boolean NOT NULL,
pollsEnabled boolean NOT NULL,
reactRolesEnabled boolean NOT NULL,
serverStatsEnabled boolean NOT NULL,
storyTimeEnabled boolean NOT NULL,
suggestionsEnabled boolean NOT NULL,
welcomeEnabled boolean NOT NULL,
captchaChannelID varchar(20),
storyTimeChannelID varchar(20),
suggestionsChannelID varchar(20),
reportChannelID varchar(20),
PRIMARY KEY (serverID)
);
CREATE TABLE welcomeMessage(
welcomeMessageID int NOT NULL AUTO_INCREMENT,
serverID varchar(20) NOT NULL,
`description` varchar(300),
instruction varchar(300),
footer varchar(100),
welcomeChannelID varchar(20),
DM boolean NOT NULL,
PRIMARY KEY (welcomeMessageID),
FOREIGN KEY (`serverID`) REFERENCES servers (`serverID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE utf8mb4_general_ci;
在“CREATE TABLE welcomeMessage”上抛出错误。我尝试使用以下方法将创建与外键分开:
ALTER TABLE welcomeMessage ADD FOREIGN KEY (`serverID`) REFERENCES servers(`serverID`);
但是它只是创建 table 然后在“Alter”行上抛出错误。 感谢任何帮助。
问题出在字符集和排序规则上。对于要成为 well-formed 的外键,父列和子列都必须具有相同的字符集和排序规则。第一条语句依赖于默认设置,而第二条语句具有显式设置。如果这些与默认值不同,则会发生故障。
如果我只是注释掉第二个 create table
语句的 charset .... collate ...
部分,您的代码就可以工作,如您所见 in this db fiddle.
两个存储引擎也需要对齐。如果您的数据库使用 MyISAM 作为默认引擎,代码也将不起作用(因为第二条语句明确使用 InnoDB)。