无法添加或更新子行:外键约束失败

时间:2011-02-15 15:11:01

标签: mysql

表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而我看不出有什么问题。

23 个答案:

答案 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也会在插入时抛出此错误。

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

答案 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)

我有类似的问题。您正在尝试在具有内容且列不可为空的表上应用外键。你有两个选择。

  1. 使要应用外键约束的列可以为空。这样,外键将被应用,因为知道某些字段可以为空。 (这就是我做的。
  2. 创建要应用外键约束的列,编写查询以将外键插入列中,然后应用外键约束。 (没试过,但它应该可行

答案 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)

中的两个表中显式设置
相关问题