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

时间:2013-05-08 17:53:45

标签: mysql mysql-workbench mysql-error-1452

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

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_networkingstate_table,CONSTRAINT country_fk   FOREIGN KEY(id)REFERENCES countryid)ON DELETE CASCADE ON   更新CASCADE)

SQL语句:

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

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

我错过了什么?

5 个答案:

答案 0 :(得分:10)

好吧,我找到答案,解决方案,我的英语不是很好,但我认为可以解释你。我尝试创建一个触发器后得到此错误,我的数据库是在phpmyadmin中创建的,这个错误让我发疯,问题是我在创建触发器之前,我在表格中加载了大量数据,并在我的孩子身上table是我父表中没有匹配的一些数据,ej:我的子表“chat”有一个“id_jugador = 1”,在我的父表中没有那个“id_jugador”,这是我的错误,希望能有所帮助你,阿根廷Rulz;)

答案 1 :(得分:9)

我认为你的外键约束中有一个拼写错误,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

答案 2 :(得分:5)

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

希望这对你有所帮助。

答案 3 :(得分:1)

example:
 table1(
    id1 INT PRIMARY KEY,
    name1 VARCHAR(50)
 )
 table2(
    id2,<--- want to add FOREIGN KEY to this field
    name2 VARCHAR(50)
 )

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

答案 4 :(得分:0)

可能的解决方案

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

即。如果你有&#39; x&#39; - &gt;表作为主要的一个表&#39;&#39; - &gt;列和&#39; y&#39; - &gt;表作为辅助表&#39 ; b&#39; - &gt;列,然后&#39;&#39; - &gt;列中的所有值必须存在于&#39; - &gt;列中,如果&#39中存在任何值; b&#39; - &gt;列并且不存在于&#39; - &gt;列中,然后它会给出这样的错误..

希望这有帮助..对于新手..