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


当前回答

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

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

其他回答

子表外键约束失败

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

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

如果在表2中创建外键之前在表1中插入了一行,则会得到一个外键约束错误,因为在表1中自动增量值为2,在表2中为1。要解决这个问题,您必须截断表1并将自动增量值设置为1。然后可以添加表2。

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

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

update table2 set UserID = 1 where UserID is null

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

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

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

希望这有用:)

这意味着您试图向table2插入一个table1中不存在的UserID值。