我有这个 SQL 代码:
CREATE TABLE IF NOT EXISTS `deputy`.`Votings` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`VRSetId` INT UNSIGNED NOT NULL,
`LNSetIdOfMeeting` INT UNSIGNED NOT NULL,
`VRSetIdOfMeeting` INT UNSIGNED NOT NULL,
`meetingId` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`, `VRSetId`),
CONSTRAINT `fk_Votings_VotingRulesSets1`
FOREIGN KEY (`VRSetId`)
REFERENCES `deputy`.`VRSets` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Votings_Meetings1`
FOREIGN KEY (`LNSetIdOfMeeting` , `VRSetIdOfMeeting` , `meetingId`)
REFERENCES `deputy`.`Meetings` (`LNSetId` , `VRSetId` , `id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
主键由两个字段组成:“id”和“VRSetId”; “VRSetId”也是外键,因为“VRSets”表具有与“投票”的一对一关系。 “Meetings”表还有第二个外键,除了“id”字段外,它本身还有用两个外键创建的主键......“Meetings”表与“Votings”有一对多关系,所以“Votings”最终得到了这么多键……这很好,因为我正在使用它们以多种不同方式获取我的数据。问题是因为我已经将自动递增添加到所有“id”字段 - 我收到这样的错误:
ERROR: Error 1005: Can't create table `deputy`.`Votings` (errno: 150 "Foreign key constraint is incorrectly formed")
这个“ session ”表具有类似格式的键,并且工作正常:
CREATE TABLE IF NOT EXISTS `deputy`.`Meetings` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`LNSetId` INT UNSIGNED NOT NULL,
`VRSetId` INT UNSIGNED NOT NULL,
`LNSetIdOfCSet` INT UNSIGNED NOT NULL,
`CSetId` INT UNSIGNED NOT NULL,
PRIMARY KEY (`id`, `LNSetId`, `VRSetId`),
CONSTRAINT `fk_Meetings_LegalNumbersSets1`
FOREIGN KEY (`LNSetId`)
REFERENCES `deputy`.`LNSets` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Meetings_VotingRulesSets1`
FOREIGN KEY (`VRSetId`)
REFERENCES `deputy`.`VRSets` (`id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Meetings_ConfigurationSets1`
FOREIGN KEY (`LNSetIdOfCSet` , `CSetId`)
REFERENCES `deputy`.`CSets` (`LNSetId` , `id`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
最后一个与“投票”相关的表格(我删除了所有表格中的数据字段以使其看起来更清晰):
CREATE TABLE IF NOT EXISTS `deputy`.`VRSets` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`))
ENGINE = InnoDB;
在我进行一些小改动之前,数据库运行良好,但现在我不确定发生了什么......整个事情都是由 MySQL Workbench 自动生成的,我正在 MariaDB 上运行脚本。
最佳答案
引用的列需要一个索引。您在 meetings
表上的主键是
PRIMARY KEY (`id`, `LNSetId`, `VRSetId`)
但您在 votings
表中引用的是这样的:
FOREIGN KEY (`LNSetIdOfMeeting` , `VRSetIdOfMeeting` , `meetingId`)
REFERENCES `deputy`.`Meetings` (`LNSetId` , `VRSetId` , `id`)
索引中列的顺序很重要,因此将其更改为
FOREIGN KEY (`meetingId`, `LNSetIdOfMeeting` , `VRSetIdOfMeeting`)
REFERENCES `deputy`.`Meetings` (`id`, `LNSetId` , `VRSetId`)
它会起作用。
- 看到它在 sqlfiddle 中实时运行
关于mysql - "Foreign key constraint is incorrectly formed",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26037319/