键约束失败 - 这是啥意思?

Posted

技术标签:

【中文标题】键约束失败 - 这是啥意思?【英文标题】:key constraint fails - what does it mean?键约束失败 - 这是什么意思? 【发布时间】:2012-03-01 15:20:01 【问题描述】:

将数据保存到我的数据库时出现此错误:

SQLSTATE[23000]:违反完整性约束:1452 无法添加或更新子行: 外键约束失败 (mydb.samplelist_item, CONSTRAINT FK_SAMPLELIST_ITEM_SAMPLELIST 外键 (samplelist_id) 引用 samplelist (samplelist_id) ON DELETE CASCADE ON UPDATE CASCADE)

不确定是什么问题。

【问题讨论】:

我可以知道你的mysql引擎吗?是innoDB还是MyISAM 不确定,我将表 samplelist 和 samplelist_item 设置为 innodb。我的数据库中的一些表是 myisam,我很确定。 你检查过innoDb是否支持外键 @SamArulRaj:MyISAM 永远不会抱怨外键,因为它不支持外键。 InnoDB 是唯一支持 FK 约束的 (AFAIK) 引擎 @a_horse_with_no_name 是的,你是对的dev.mysql.com/doc/refman/5.5/en/… 问题可能是因为这个......我怀疑 【参考方案1】:

听起来您正在尝试使用外键向表中添加一行,但您为外键列指定的值在外表中没有匹配项。

【讨论】:

那么在哪个表 iyo 中缺少什么? 看起来您尝试在samplelist_item 中为samplelist_id 设置的值在samplelist 中没有匹配的行。 是的,samplelist 中的一行与 samplelist_id 的值相同,因为您尝试在 samplelist_item 的新(或更新)行中设置。 我检查了我的数据库,只有 samlpelist 有一行,但没有 samplelist_item。每一行都必须有一个领带,这不是真的,这就是你说的问题? @EOB 是的,您在 samplelist_item 表中添加的每个 samplelist_id 必须已经存在于 samplelist 表的 samplelist_id 列中。【参考方案2】:

Ref这将是手动的问题

如果父表中没有匹配的候选键值,InnoDB 拒绝任何尝试在子表中创建外键值的 INSERT 或 UPDATE 操作。当 UPDATE 或 DELETE 操作影响父表中具有匹配行的子表中的键值时,结果取决于使用 FOREIGN KEY 子句的 ON UPDATE 和 ON DELETE 子句指定的引用操作。 InnoDB 支持关于要采取的操作的五个选项。如果未指定 ON DELETE 或 ON UPDATE,则默认操作为 RESTRICT。

【讨论】:

是的,因为可能是您的子表引用了您的父表,因此在这种情况下会出现错误。

以上是关于键约束失败 - 这是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

“getaddrinfo 失败”,这是啥意思?

在 My SQL 中不断收到外键约束失败消息

无法删除表:外键约束失败

这是啥意思? “加载资源失败:服务器响应状态为 405(不允许方法)”

闪亮的应用程序因“参数 1(类型 'closure')不能被 'cat' 处理”而失败 - 这是啥意思?

SQL Server 2014 数据还原失败这是啥原因?怎么处理