表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:
Cannot add or update a child row: a foreign key constraint fails
(`myapp/table2`, CONSTRAINT `table2_ibfk_1` FOREIGN KEY (`UserID`)
REFERENCES `table1` (`UserID`))
我做错了什么?我看了http://www.w3schools.com/Sql/sql_foreignkey.asp而我看不出有什么问题。
答案 0 :(得分:201)
您收到此错误的原因是您尝试根据当前存储在{{table2
字段中的值,将行添加/更新为UserID
字段。 1}}。如果您发布更多代码,我可以帮助您诊断具体原因。
答案 1 :(得分:115)
这意味着您要尝试在table2
中插入UserID
table1
中不存在的{{1}}值。
答案 2 :(得分:85)
一个简单的hack可以是在对表执行任何操作之前禁用外键检查。只需查询
SET FOREIGN_KEY_CHECKS=0
这将禁用与任何其他表的外键匹配。完成表后再次启用它
SET FOREIGN_KEY_CHECKS=1
这对我很有用。
答案 3 :(得分:36)
我发现了另一个奇怪的情况:如果你不小心从InnoDB表创建了一个外键到MyISAM表,那么即使数据有效,MySQL也会在插入时抛出此错误。
答案 4 :(得分:14)
您收到此错误是因为table2.UserID
上存在一些值table1.UserID
的值{我猜您在创建此外键之前已设置table2.UserID
值)。
这个场景的一个例子:table1.UserID
获取值1,2,3和table2.UserID
获取值4(手动添加)。因此,当您创建外键时,他们无法从UserID = 4
找到table1
,并且错误将会发生。
要解决此错误,只需从UserID = 4
中删除table2
,或者您可以清空它们,然后创建外键和。
祝你好运!
答案 5 :(得分:10)
如果在表2中创建外键之前在表1中插入了一行,则会出现外键约束错误,因为表1中的自动增量值为2,表2中的自动增量值为1.要解决此问题你必须截断表1并将自动增量值设置回1.然后你可以添加表2。
答案 6 :(得分:6)
我遇到了同样的问题,解决方案很容易。
您正尝试在父表中添加不存在的子表中的ID。
检查一下,因为InnoDB有时会在不添加值的情况下增加auto_increment列的错误,例如,INSERT ... ON DUPLICATE KEY
答案 7 :(得分:5)
确保您已将数据库引擎设置为InnoDB,因为在MyISAM中不支持外键和事务
答案 8 :(得分:5)
我有类似的问题。您正在尝试在具有内容且列不可为空的表上应用外键。你有两个选择。
答案 9 :(得分:4)
确保插入外键的值存在于父表中。这对我有所帮助。例如,如果您将ng build --aot --nc --output-hashing=false
插入user_id = 2
,但table.2
没有table.1
,则约束将引发错误。我的确是错误代码#1452。希望这可以帮助其他人解决同样的问题!
答案 10 :(得分:3)
我遇到了同样的问题,原因是在添加外键之前我在第一个表中有一行。
答案 11 :(得分:2)
只需一点修复: 在表1中使JoinColumn为“ nullable = true”,在表2中为“ UserID”字段“ insertable = false”和“ nullable = true”。
在表1实体中:
@OneToMany(targetEntity=Table2.class, cascade = CascadeType.ALL)
@JoinColumn(name = "UserID", referencedColumnName = "UserID", nullable = true)
private List<Table2> table2List;
在Table2实体中:
@Column(insertable = false, nullable = true)
private int UserID;
答案 12 :(得分:1)
我也遇到了同样的问题,问题是我的父表条目值与外键表值不匹配。 所以请在清除所有行后尝试..
答案 13 :(得分:1)
您不应将ondelete字段放在数据库中的级联上。
因此将onDelete字段设置为RESTRICT
祝你好运♥
答案 14 :(得分:1)
删除table2的UserID字段的索引。它适合我
答案 15 :(得分:0)
也许在您添加userID
列的同时,该特定表的数据已建立,因此默认值为0
,请尝试添加不含{{1}的列}}
答案 16 :(得分:0)
我也遇到了这个错误:“无法添加或更新子行:外键约束失败”。向父表添加新行时出现错误
问题是外键约束已经在父表而不是子表上定义。
答案 17 :(得分:0)
又一个奇怪的案例给了我这个错误。我错误地将我的外键引用到了id主键。这是由不正确的alter table命令引起的。我通过查询INFORMATION_SCHEMA表(See this stackoverflow answer)
找到了这个表格很混乱,无法通过任何 ALTER TABLE 命令修复。我终于放弃了桌子并重建了它。这摆脱了integrityError。
答案 18 :(得分:0)
该表是否包含任何现有数据? 如果是这样,请尝试清除要添加外键的表中的所有数据。 然后再次运行代码(添加外键)。
我多次遇到此问题。当您想在现有表上添加外键时,清除表中的所有数据即可。
希望它能起作用:)
答案 19 :(得分:0)
这花了我一段时间才能弄清楚。简而言之,引用另一个表的表中已经有数据,并且其一个或多个值在父表中不存在。
例如 表2具有以下数据:
UserID PostID Title Summary
5 1 Lorem Ipsum dolor sit
表1
UserID Password Username Email
9 ******** JohnDoe john@example.com
如果尝试更改table2并添加外键,则查询将失败,因为Table1中不存在UserID = 5。
答案 20 :(得分:0)
如果其他人提供的解决方案不起作用。然后,您应该尝试检查父表和子表的数据库引擎。在我的情况下,我将父表的引擎设置为“ MyISAM”,将其更改为InnoDB对其进行了修复。
希望这可以帮助像我一样受困的其他人。
答案 21 :(得分:0)
当您要添加一个外键且其值在父表的主键中不存在时,会发生该错误。您必须确保table2中的新外键UserID具有table1主键中存在的值,有时默认情况下它为null或等于0。
您可以首先使用table1的主键中存在的值来更新table2中的外键的所有字段。
update table2 set UserID = 1 where UserID is null
如果要添加其他UserID,则必须使用所需的值修改每一行。
答案 22 :(得分:-1)
子表外键约束失败
由于以下原因,此问题可能会上升:
如果你在Spring mvc中这样做,你需要显式地描述id类型,因为有时mysql无法识别id的类型。因此,您在实体类@GeneratedValue (strategy = GenerationType.IDENTITY)