表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修复了它。

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

其他回答

另一个奇怪的情况给了我这个错误。我错误地将外键引用到id主键。这是由错误的alter表命令引起的。我通过查询INFORMATION_SCHEMA表发现了这一点(参见这个stackoverflow答案)

该表非常混乱,任何ALTER table命令都无法修复。我终于放下桌子,重新组装。这消除了integrityError。

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

SET FOREIGN_KEY_CHECKS=0

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

SET FOREIGN_KEY_CHECKS=1

这对我来说很管用。


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

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

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

我还得到了这个错误:“不能添加或更新一个子行:一个外键约束失败”。我得到了错误时,添加一个新行到父表

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

您不应该在数据库中的级联上放置ondelete字段。

因此,将onDelete字段设置为RESTRICT

祝你好运!