表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,我不知道有什么问题。


当前回答

以防别人提供的解决方案不管用。然后,您应该尝试检查父表和子表的数据库引擎。在我的例子中,我将父表的引擎设置为“MyISAM”,将其更改为InnoDB修复了它。

希望这能帮助其他像我一样被困住的人。

其他回答

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

表中是否包含任何现有数据? 如果是,请尝试清除要添加外键的表中的所有数据。 然后再次运行代码(添加外键)。

这个问题我遇到过很多次了。当您想在现有表上添加外键时,清除表中的所有数据可以工作。

希望这有用:)

当您希望添加外键时,该错误会发生在父表的主键中不存在的值。必须确保table2中的新外键UserID具有table1主键中存在的值,有时默认为null或等于0。

你可以先用一个存在于table1的主键中的值来更新table2中外键的所有字段。

update table2 set UserID = 1 where UserID is null

如果要添加不同的userid,则必须使用所需的值修改每行。

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

SET FOREIGN_KEY_CHECKS=0

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

SET FOREIGN_KEY_CHECKS=1

这对我来说很管用。


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

确保插入到外键的值存在于父表中。这对我很有帮助。例如,如果将user_id = 2插入到表中。2、但表。1没有user_id = 2,那么约束将抛出一个错误。准确地说,我的错误代码是#1452。希望这能帮助其他有同样问题的人!