表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。

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

其他回答

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

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

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

因此,将onDelete字段设置为RESTRICT

祝你好运!

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

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

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

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

只是一点点修复: 使JoinColumn在Table1中为'nullable=true', 'UserID'字段在Table2中为'insertable=false'和'nullable=true'。

表1实体:

@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;

表2实体:

@Column(insertable = false, nullable = true)
private int UserID;