表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中不存在。

其他回答

我也面临同样的问题,问题是我的父表项值不匹配外键表值。 所以请尝试后清除所有行..

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

也许当你添加userID列时,有一个特定表的数据,它已经建立,所以它将有一个默认值为0,尝试添加不带NOT NULL的列

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

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

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

如。 表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中不存在。