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


当前回答

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

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

其他回答

我也遇到过类似的问题。您正在尝试对一个有内容且列不可空的表应用外键。你有两个选择。

使要应用外键约束的列为可空。这样就可以应用外键,知道某些字段可以为空。(这就是我所做的。) 创建要应用外键约束的列,编写查询将外键插入该列,然后应用外键约束。(没有尝试过,但应该可以工作)

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

İf你使用mysql索引或表之间的关系,首先你删除列(例如:city_id),并创建新的列同名(例如:city_id)。然后再试一次……

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

您正在尝试在子表中添加父表中不存在的id。

检查好,因为InnoDB有一个bug,有时会增加auto_increment列而不增加值,例如INSERT…关于重复的密钥

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