无法添加或更新子行:外键约束失败
表格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 ,我不明白什么是错的。
你得到这个错误是因为你试图根据当前存储在table1
的值添加/更新table2
中没有UserID
字段有效值的行。 如果您张贴更多的代码,我可以帮助您诊断具体原因。
这意味着你正在试图插入到table2
一个UserID
值不存在于table1
。
简单的黑客可以在对表执行任何操作之前禁用外键检查。 只需查询
SET FOREIGN_KEY_CHECKS=0
这将禁用外键匹配任何其他表。 完成表后,再次启用它
SET FOREIGN_KEY_CHECKS=1
这对我来说很多次。
我发现了另外一个奇怪的情况:如果你不小心从InnoDB表创build了一个外键给MyISAM表,MySQL在插入的时候会抛出这个错误,即使数据是有效的。
见http://nick.zoic.org/sql/mysql-foreign-keys-between-innodb-and-myisam/
如果在创build表2中的外键之前已经将一行插入到表1中,则会出现外键约束错误,因为表1中的自动递增值为2,表2中的值为1。截断表1并将自动递增值设置回1.然后您可以添加表2。
你得到这个错误,因为有一些值int table2.UserID
是不存在的table1.UserID
(我猜你已经在创build这个外键之前设置了table2.UserID
值manualy)。
此场景的一个示例: table1.UserID
获取值1,2,3和table2.UserID
获取值4(手动添加)。 所以当你创build一个外键的时候,他们在table1
找不到UserID = 4
,这个错误就会被破坏。
要解决这个错误,只需从table2
删除UserID = 4
,或者可以清空它们,然后创build外键和。
祝你好运!
我刚刚遇到同样的问题,解决scheme很简单。
您正尝试在父表中不存在的子表中添加一个ID。
检查一下,因为InnoDB有错误,有时会增加auto_increment列而不增加值,例如, INSERT ... ON DUPLICATE KEY
确保你已经将数据库引擎设置为InnoDB,因为MyISAM外键和事务不受支持
我有一个类似的问题。 您正在尝试将外键应用于具有内容且不能为空的表。 你有两个select。
- 使要应用外键约束的列可以为空。 这样外键将应用知道有些领域可以为空。 ( 这是我做的。 )
- 创build要应用外键约束的列,编写查询以将外键插入列,然后应用外键约束。 ( 没有尝试这个,但它应该工作 )
又一个奇怪的例子给了我这个错误。 我错误地引用了我的外键到ID主键。 这是由不正确的alter table命令造成的。 我通过查询INFORMATION_SCHEMA表发现了这一点(请参阅此stackoverflow答案)
该表很困惑,无法通过任何ALTER TABLE命令修复。 我终于放下了桌子,重build了它。 这摆脱了诚信的错误。
也许当你添加userID
列的时候,这个特定的表有一个数据,它被build立,所以它的默认值是0
,尝试添加没有NOT NULL
的列
我也有这个错误:“无法添加或更新子行:外键约束失败”。 向父表添加新行时遇到了错误
问题是在父表上而不是在子表上定义了外键约束。
如果您使用mysql索引或表之间的关系,首先删除colums(例如:city_id)并创build具有相同名称的新colums(例如:city_id)。然后重试…