Mysql 无法添加或更新子行:外键约束失败
表1 表2Mysql 无法添加或更新子行:外键约束失败,mysql,Mysql,表1 表2 +----------+-------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+-------------+------+-----+---------+----------------+ | UserID | int(11) | NO | PRI | NUL
+----------+-------------+------+-----+---------+----------------+
| 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 | | | |
+----------+-------------+------+-----+---------+----------------+
错误:
+------------------+--------------+------+-----+---------+----------------+
| 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 | | | |
+------------------+--------------+------+-----+---------+----------------+
我做错了什么?我读了,看不出有什么问题。您出现此错误是因为您试图向
表2
添加/更新一行,该行基于表1
中当前存储的值,没有有效的UserID
字段值。如果您发布更多代码,我可以帮助您诊断具体原因。您遇到此错误是因为您试图向表2
添加/更新一行,该行基于当前存储在表1
中的值,没有有效的UserID
字段值。如果您发布更多的代码,我可以帮助您诊断具体原因。这意味着您试图在表2
中插入表1
中不存在的用户ID
值,这意味着您试图在表2中插入中不存在的用户ID
值table1
如果在表2中创建外键之前在表1中插入了一行,则会出现外键约束错误,因为自动递增值在表1中为2,在表2中为1。要解决此问题,必须截断表1并将自动增量值设置回1。然后可以添加表2。如果在表2中创建外键之前在表1中插入了一行,则会出现外键约束错误,因为自动递增值在表1中为2,在表2中为1。要解决此问题,必须截断表1并将自动增量值设置回1。然后您可以添加表2。您得到这个错误是因为有一些值inttable2.UserID
不存在于table1.UserID
(我想您在创建这个外键之前已经手动设置了table2.UserID
值)。
此场景的一个示例:table1.UserID
get values 1,2,3和table2.UserID
get values 4(手动添加)。因此,当您创建外键时,他们无法从table1
中找到UserID=4
,并且会出现错误。
要修复此错误,只需从table2
中删除UserID=4
,或者您可以将两者都清空,然后创建外键和。
祝你好运 之所以出现此错误,是因为在table2.UserID
中有一些值不存在于table1.UserID
(我猜您在创建此外键之前已经手动设置了table2.UserID
值)。
此场景的一个示例:table1.UserID
get values 1,2,3和table2.UserID
get values 4(手动添加)。因此,当您创建外键时,他们无法从table1
中找到UserID=4
,并且会出现错误。
要修复此错误,只需从table2
中删除UserID=4
,或者您可以将两者都清空,然后创建外键和。
祝你好运 我发现了另一个奇怪的情况:如果您意外地从InnoDB表创建了一个外键到MyISAM表,MySQL会在插入时抛出这个错误,即使数据是有效的
请参见我发现了另一个奇怪的情况:如果您意外地从InnoDB表创建了一个外键到MyISAM表,MySQL在插入时会抛出这个错误,即使数据在其他方面是有效的
请看另一个给我这个错误的奇怪案例。我错误地将外键引用到id主键。这是由错误的alter table命令引起的。我通过查询INFORMATION\u SCHEMA表发现了这一点
表格太混乱了,任何ALTER table命令都无法修复。我终于放下桌子,把它重建了。这消除了integrityError。又是一个奇怪的案例,给了我这个错误。我错误地将外键引用到id主键。这是由错误的alter table命令引起的。我通过查询INFORMATION\u SCHEMA表发现了这一点
表格太混乱了,任何ALTER table命令都无法修复。我终于放下桌子,把它重建了。这就消除了integrityError。一个简单的黑客可以在对表执行任何操作之前禁用外键检查。质询
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`))
这将禁用与任何其他表的外键匹配。使用完表后,再次启用它
SET FOREIGN_KEY_CHECKS=0
这对我来说很有用
请注意,执行此操作时,您将进入危险区域。虽然确实存在有效的用例,但只有当您确信自己理解其含义时,才应该这样做。一个简单的方法是在对表执行任何操作之前禁用外键检查。质询
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`))
这将禁用与任何其他表的外键匹配。使用完表后,再次启用它
SET FOREIGN_KEY_CHECKS=0
这对我来说很有用
请注意,执行此操作时,您将进入危险区域。虽然确实存在有效的用例,但只有当您确信自己理解其含义时,才应该这样做。可能在您添加userID
列时,已经为该表建立了一个数据,因此它的默认值为0
,尝试添加不带非空
的列可能在添加userID
列时,有一个为该表建立的数据,因此它的默认值为0
,尝试添加不带非空的列。我还遇到了以下错误:“无法添加或更新子行:外键约束失败”。我在向父表添加新行时出错
问题是在父表而不是子表上定义了外键约束。我也遇到了这个错误:
@Column(insertable = false, nullable = true)
private int UserID;
UserID PostID Title Summary
5 1 Lorem Ipsum dolor sit
UserID Password Username Email
9 ******** JohnDoe john@example.com
update table2 set UserID = 1 where UserID is null