ERROR 1452:无法添加或更新子行:外键约束失败

Posted

技术标签:

【中文标题】ERROR 1452:无法添加或更新子行:外键约束失败【英文标题】:ERROR 1452: Cannot add or update a child row: a foreign key constraint fails 【发布时间】:2013-05-03 01:33:27 【问题描述】:

我通过 mysql Workbench 5.2.47 在 MySQL 5.6.11 中创建了两个表,如下所示。

country 表:

delimiter $$

CREATE TABLE `country` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `country_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INC

REMENT=2 DEFAULT CHARSET=utf8$$

state_table:

delimiter $$

CREATE TABLE `state_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `state_name` varchar(45) DEFAULT NULL,
  `country_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `country_fk` FOREIGN KEY (`id`) REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT=''$$

country 表中有一行 id 为 1。它只允许将一个(子)行插入其子表 state_table。如果尝试更多行,则会出现以下错误。

错误 1452:无法添加或更新子行:外键约束 失败(social_networking.state_table,约束country_fk 外键 (id) 引用 country (id) 开启 删除级联开启 更新级联)

SQL 语句:

INSERT INTO `social_networking`.`state_table` (`id`, `state_name`, `country_id`) VALUES ('2', 'xxx', '1')

实际上,我正在尝试使用 ORM (JPA) 映射这些表,而我总是只看到 OneToOne 关系。

我错过了什么?

【问题讨论】:

【参考方案1】:

好吧,我找到了答案,解决方案,我的英语不是很好,但我想可以解释你。尝试创建触发器后出现此错误,我的数据库是在 phpmyadmin 中创建的,这个错误让我抓狂,问题是我在创建触发器之前,在我的表和我的孩子中加载了很多数据表是一些在我的父表中不匹配的数据,ej:我的子表“聊天”有一个“id_jugador = 1”,而在我的父表中没有那个“id_jugador”,这是我的错误,我希望有所帮助你,阿根廷鲁尔茨 ;)

【讨论】:

【参考方案2】:

我认为您的外键约束中有错字,country_id 应该是 country 的外键。当id 是外键时,你只能插入一行,因为它恰好得到 id=1 与国家行的 id 相同;

CONSTRAINT `country_fk` FOREIGN KEY (`id`) 
    REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

应该是

CONSTRAINT `country_fk` FOREIGN KEY (`country_id`) 
    REFERENCES `country` (`id`) ON DELETE CASCADE ON UPDATE CASCADE

An SQLfiddle to test with.

【讨论】:

谢谢,但是所有表的主键名称都是id @Tiny 是的,但您希望state_table.country_id 引用country.id 列。您现在拥有的是 state_table.id 列引用 country.id,它只允许每个国家/地区只允许一个州,反之亦然。 我已将每个表的列名 id 重命名并使其有意义,例如 country_idstate_idcity_id... 我没有注意到这些 DDL 语句,因为表由 MySQL Workbench 创建。谢谢!【参考方案3】:

我遇到了同样的问题,而且关系名称没有错。 我遇到了不同记录的问题,即尝试注册另一个表中不存在的记录,因此产生了此错误。 检查该记录是否存在于另一个表中以插入它们正确的关系,否则会出现此错误。

希望对您有所帮助。

【讨论】:

【参考方案4】:
example:
 table1(
    id1 INT PRIMARY KEY,
    name1 VARCHAR(50)
 )
 table2(
    id2,<--- want to add FOREIGN KEY to this field
    name2 VARCHAR(50)
 )

在添加约束外键之前,您必须在id1id2 之间具有正确的值,因此您应该使用相互映射的值更新该 id 字段。

【讨论】:

【参考方案5】:

可能的解决方案

如果您有实时数据,请检查所有列值。

即如果你有 'x'->table 作为主要的有 'a'->column 和 'y'->table 作为次要的 'b'->column,那么 'b'->column 中的所有值必须存在于' a'->column 如果 'b'->column 中存在任何值,而 'a'->column 中不存在任何值,那么它将给出这样的错误..

希望对新手有所帮助..

【讨论】:

以上是关于ERROR 1452:无法添加或更新子行:外键约束失败的主要内容,如果未能解决你的问题,请参考以下文章

MySql 重启后:#1452 - 无法添加或更新子行:外键约束失败

SQLSTATE[23000]:完整性约束违规 1452 无法添加或更新子行:外键约束失败

完整性约束违规:1452 无法添加或更新子行:外键约束失败

Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败

代码:1452。无法添加或更新子行:外键约束失败(`WW2`

SQLSTATE [23000]:完整性约束违规:1452 无法添加或更新子行:外键约束失败