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


当前回答

如果您添加了复选框NOT NULL的列 你会惊讶地发现所有的行都是0, 当你尝试添加外键时,可能你在foreign table2中没有值为0的行,所以mysql错误弹出显示

其他回答

子表外键约束失败

这个问题可能是由以下原因引起的:

如果你在Spring mvc中这样做,你需要显式地描述id类型,因为有时mysql无法识别id的类型。所以你显式设置为在你的实体class@GeneratedValue(策略= GenerationType.IDENTITY)

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

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

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

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

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

You're getting this error because there are some value int table2.UserID that is not exists on table1.UserID (I guess that you have setted table2.UserID value manualy before you created this foreign key). One example for this scene: table1.UserID get values 1,2,3 and table2.UserID get values 4 (add by manual). So when you make a foreign key, they can't find UserID = 4 from table1 and the error will ocurse. To fix this error, just remove UserID = 4 from table2 or you can empty both of them and then create the foreign key and. Good luck!