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

表格1

+----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | UserID | int(11) | NO | PRI | NULL | auto_increment | | Password | varchar(20) | NO | | | | | Username | varchar(25) | NO | | | | | Email | varchar(60) | NO | | | | +----------+-------------+------+-----+---------+----------------+ 

表2

 +------------------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------------+--------------+------+-----+---------+----------------+ | UserID | int(11) | NO | MUL | | | | PostID | int(11) | NO | PRI | NULL | auto_increment | | Title | varchar(50) | NO | | | | | Summary | varchar(500) | NO | | | | +------------------+--------------+------+-----+---------+----------------+ 

错误:

 com.mysql.jdbc.exceptions.MySQLIntegrityConstraintViolationException: Cannot add or update a child row: a foreign key constraint fails (`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`) REFERENCES `table1` (`UserID`)) 

我做错了什么? 我阅读http://www.w3schools.com/Sql/sql_foreignkey.asp ,我不明白什么是错的。

你得到这个错误是因为你试图根据当前存储在table1的值添加/更新table2中没有UserID字段有效值的行。 如果您张贴更多的代码,我可以帮助您诊断具体原因。

这意味着你正在试图插入到table2一个UserID值不存在于table1

简单的黑客可以在对表执行任何操作之前禁用外键检查。 只需查询

 SET FOREIGN_KEY_CHECKS=0 

这将禁用外键匹配任何其他表。 完成表后,再次启用它

 SET FOREIGN_KEY_CHECKS=1 

这对我来说很多次。

我发现了另外一个奇怪的情况:如果你不小心从InnoDB表创build了一个外键给MyISAM表,MySQL在插入的时候会抛出这个错误,即使数据是有效的。

http://nick.zoic.org/sql/mysql-foreign-keys-between-innodb-and-myisam/

如果在创build表2中的外键之前已经将一行插入到表1中,则会出现外键约束错误,因为表1中的自动递增值为2,表2中的值为1。截断表1并将自动递增值设置回1.然后您可以添加表2。

你得到这个错误,因为有一些值int table2.UserID是不存在的table1.UserID (我猜你已经在创build这个外键之前设置了table2.UserID值manualy)。
此场景的一个示例: table1.UserID获取值1,2,3和table2.UserID获取值4(手动添加)。 所以当你创build一个外键的时候,他们在table1找不到UserID = 4 ,这个错误就会被破坏。
要解决这个错误,只需从table2删除UserID = 4 ,或者可以清空它们,然后创build外键和。
祝你好运!

我刚刚遇到同样的问题,解决scheme很简单。

您正尝试在父表中不存在的子表中添加一个ID。

检查一下,因为InnoDB有错误,有时会增加auto_increment列而不增加值,例如, INSERT ... ON DUPLICATE KEY

确保你已经将数据库引擎设置为InnoDB,因为MyISAM外键和事务不受支持

我有一个类似的问题。 您正在尝试将外键应用于具有内容且不能为空的表。 你有两个select。

  1. 使要应用外键约束的列可以为空。 这样外键将应用知道有些领域可以为空。 ( 这是我做的。
  2. 创build要应用外键约束的列,编写查询以将外键插入列,然后应用外键约束。 ( 没有尝试这个,但它应该工作

又一个奇怪的例子给了我这个错误。 我错误地引用了我的外键到ID主键。 这是由不正确的alter table命令造成的。 我通过查询INFORMATION_SCHEMA表发现了这一点(请参阅此stackoverflow答案)

该表很困惑,无法通过任何ALTER TABLE命令修复。 我终于放下了桌子,重build了它。 这摆脱了诚信的错误。

也许当你添加userID列的时候,这个特定的表有一个数据,它被build立,所以它的默认值是0 ,尝试添加没有NOT NULL的列

我也有这个错误:“无法添加或更新子行:外键约束失败”。 向父表添加新行时遇到了错误

问题是在父表上而不是在子表上定义了外键约束。

如果您使用mysql索引或表之间的关系,首先删除colums(例如:city_id)并创build具有相同名称的新colums(例如:city_id)。然后重试…