问题描述
已收到错误:
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`);
但是,它只是创建表,然后在“ Alter”行上引发错误。 任何帮助表示赞赏。
解决方法
问题是字符集和排序规则。为了使外键格式正确,父列和子列必须具有相同的字符集和排序规则。第一条语句依赖默认设置,第二条语句具有显式设置。如果这些与默认值不同,则会发生故障。
如果我只注释掉第二条charset .... collate ...
语句的create table
部分,您的代码就会起作用,如您所见in this db fiddle。
两个存储引擎也都需要对齐。如果您的数据库使用MyISAM作为默认引擎,则该代码也不起作用(因为第二条语句明确使用InnoDB)。