发生数据库错误 1452
Posted
技术标签:
【中文标题】发生数据库错误 1452【英文标题】:A Database Error Occurred 1452 【发布时间】:2013-02-06 14:33:15 【问题描述】:我正在做一个需要我在 phpMyAdmin 中使用外键的项目。我在两个表上设置了外键。 tblquestions
链接到 answers
表,但是当我尝试将数据插入 tblquestions
时,我收到此错误
发生数据库错误
错误号:1452
无法添加或更新子行:外键约束失败 (
user_test
.tblquestions
, 约束tblquestions_ibfk_5
外国 KEY (QID
) REFERENCESanswers
(ID
) ON DELETE CASCADE ON UPDATE 级联)插入
tblquestions
(Question
、qA
、qB
、qC
)值 ('unikalus klausimas','unikalus atsakymas','unikalus atsakymas', 'unikalus atsakymas')
【问题讨论】:
带连接的表和带外键的表有什么区别? 你知道有什么教程可以帮助我建立一个带有连接的表吗? @YogeshSuthar - 外键有助于加强参照完整性。请不要建议其他人避免使用它们。 【参考方案1】:如果您已将tblquestions
链接到answers
,则应先添加答案,然后添加问题。否则,由于您试图在父级之前添加子级,因此无法保持参照完整性。 (始终在子级之前添加父级。)
这是一种方法。让我们使用两个表:tbl_question
、tbl_answer
。
tbl_question
至少有两列:
int
问题:text
tbl_answer
包含可能正确的答案(如果您想为一个问题添加一组可选答案,则可能是错误的)。
int
,FK 到 tbl_question
id
answer_option:tinyint(1)
/char(1)
,单个问题的一组可选答案
回答:text
is_correct: tinyint(1)
/byte(1)
(标记问题的正确答案)
使question_id
和answer_option
成为复合PK。现在您可以通过id
/question_id
加入这两个表,并获得一个问题的所有可选答案。只需确保其中只有一个被标记为正确即可。
我会发布这个答案,尽管在我写这篇文章时你已经接受了一个答案。就像 tombom 说的,你有一个 FK 建立错误的方式。
不知道您通过询问有关设置带有联接的表的教程是什么意思。您应该首先熟悉外键的概念,然后您可以以任何您喜欢的方式加入您的表。这里有几个链接。
http://en.wikipedia.org/wiki/Foreign_key http://www.sitepoint.com/mysql-foreign-keys-quicker-database-development/ What is the difference between Left, Right, Outer and Inner Joins? http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlFK 的概念非常简单,就是与另一个表上的列相关的列(通过使用外键列的值连接两个或多个表)。只要记住在这些表/值之间添加一个 FK 约束,这样当您尝试做一些破坏约束的事情时,RDBMS 就会向您发出警告。就像这里当您尝试为不存在的问题添加答案时一样。
最后,如果您关心引用完整性,请使用 InnoDB(每个 DB 设计者/经理/管理员都应该这样做)。
http://dev.mysql.com/doc/refman/5.5/en/ansi-diff-foreign-keys.html【讨论】:
【参考方案2】:外键基本上无非是“表中的条目必须在被引用表中具有对应值”的规则。
在您的情况下,逻辑是,不存在的问题不可能有答案。所以你把外键放错了。
然后,当您插入数据时,您必须先插入问题的行。当您插入答案的行时,您必须查找答案所属问题的 ID。
顺便说一句,请忽略 Yogesh Suthar 的 cmets。外键是确保数据完整性的数据库的一个非常重要的特性,显然他不知道他在说什么。
【讨论】:
以上是关于发生数据库错误 1452的主要内容,如果未能解决你的问题,请参考以下文章