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


当前回答

我花了一段时间才想明白。简单地说,引用另一个表的表中已经有数据,它的一个或多个值在父表中不存在。

如。 表2的数据如下:

UserID    PostID    Title    Summary
5         1         Lorem    Ipsum dolor sit

表1

UserID    Password    Username    Email
9         ********    JohnDoe     john@example.com

如果尝试ALTER table2并添加外键,则查询将失败,因为UserID=5在Table1中不存在。

其他回答

一个简单的破解方法是在对表执行任何操作之前禁用外键检查。简单查询

SET FOREIGN_KEY_CHECKS=0

这将禁用与任何其他表的外键匹配。处理完表后,再次启用它

SET FOREIGN_KEY_CHECKS=1

这对我来说很管用。


请注意,当你这样做时,你进入了危险区。虽然确实存在有效的用例,但只有当您确定了解其含义时才应该这样做。

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

确保插入到外键的值存在于父表中。这对我很有帮助。例如,如果将user_id = 2插入到表中。2、但表。1没有user_id = 2,那么约束将抛出一个错误。准确地说,我的错误代码是#1452。希望这能帮助其他有同样问题的人!

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!

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

因此,将onDelete字段设置为RESTRICT

祝你好运!