表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: 无法添加或更新子行:外键约束失败 (myapp/table2,约束table2_ibfk_1外键(UserID)) 引用表1 (UserID))

我做错了什么?我读了http://www.w3schools.com/Sql/sql_foreignkey.asp,我不知道有什么问题。


当前回答

我发现了另一个奇怪的情况:如果你无意中创建了一个从InnoDB表到MyISAM表的外键,MySQL在插入时抛出这个错误,即使数据是有效的。

参见http://nick.zoic.org/art/mysql-foreign-key-error/

其他回答

删除table2的UserID字段的索引。它很适合我

我也面临同样的问题,问题是我的父表项值不匹配外键表值。 所以请尝试后清除所有行..

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

一个简单的破解方法是在对表执行任何操作之前禁用外键检查。简单查询

SET FOREIGN_KEY_CHECKS=0

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

SET FOREIGN_KEY_CHECKS=1

这对我来说很管用。


请注意,当你这样做时,你进入了危险区。虽然确实存在有效的用例,但只有当您确定了解其含义时才应该这样做。

请确保您已将数据库引擎设置为InnoDB,因为在MyISAM中不支持外键和事务