【问题标题】:"Foreign key constraint is incorrectly formed"“外键约束格式不正确”
【发布时间】:2014-11-20 03:38:55
【问题描述】:

我有这个 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”表与“Votings”具有一对一的关系。 “会议”表还有第二个外键,除了“id”字段外,它本身还有用两个外键创建的主键......“会议”表与“投票”有一对多的关系,所以“投票”最终得到了这么多键......这很好,因为我正在使用它们以多种不同的方式获取我的数据。问题是,因为我已经为所有“id”字段添加了自动增量 - 我收到了这样的错误:

ERROR: Error 1005: Can't create table `deputy`.`Votings` (errno: 150 "Foreign key constraint is incorrectly formed")

这个“会议”表具有类似格式的键,并且工作正常:

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 上。

【问题讨论】:

  • 您能添加您所引用表的CREATE TABLE 语法吗?如果您只使用 一个 外键约束,代码是否有效?
  • 如果有帮助请点赞这个答案:)

标签: mysql sql mysql-workbench mariadb


【解决方案1】:

引用的列需要一个索引。 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 中实时查看它的工作情况

【讨论】:

  • 谢谢,我不知道。当我将“id”列置于顶部以使 AI 属性起作用时,顺序会自动更改。
猜你喜欢
  • 1970-01-01
  • 2021-11-07
  • 2018-09-04
  • 2017-10-03
  • 2019-07-25
  • 1970-01-01
  • 2017-10-04
  • 2018-06-19
  • 2018-03-02
相关资源
最近更新 更多