表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错误弹出显示

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

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

update table2 set UserID = 1 where UserID is null

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

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

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

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

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

希望这有用:)

只是一点点修复: 使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;