发生数据库错误1452

时间:2013-02-21 10:03:04

标签: php mysql codeigniter phpmyadmin

我正在开发一个项目,要求我在phpMyAdmin中使用外键。我在两个表上设置了外键。 tblquestions已链接到answers表,但当我尝试将数据插入tblquestions时,我收到此错误

  

发生数据库错误

     

错误号码:1452

     

无法添加或更新子行:外键约束失败   (user_testtblquestions,CONSTRAINT tblquestions_ibfk_5外国   KEY(QID)引用answersID)ON更新级联更新   CASCADE)

     

INSERT INTO tblquestionsQuestionqAqBqC)价值观   ('unikalus klausimas','unikalus atsakymas','unikalus atsakymas',   'unikalus atsakymas')

2 个答案:

答案 0 :(得分:1)

外键基本上只是规则"表中的条目必须在引用的表中具有相应的值"。

在你的情况下,逻辑是,不存在对不存在的问题的答案。所以你用错误的方式把外键拿出来。

然后,当您插入数据时,您必须先插入问题的行。插入答案的行时,必须查找答案所属问题的ID。

顺便说一句,请忽略Yogesh Suthar的评论。外键是确保数据完整性的数据库的一个非常重要的功能,显然他不知道他在说什么。

答案 1 :(得分:0)

如果您已将tblquestionsanswers相关联,则应首先添加答案,然后再添加问题。否则,由于您尝试在父级之前添加子级,因此无法保持参照完整性。 (始终在孩子之前添加父母。)

这是一种方法。让我们使用两个表:tbl_questiontbl_answer

tbl_question至少有两列:

  • id:int
  • 问题:text

tbl_answer包含可能正确的答案(如果您想在一个问题中添加一组可选答案,则会出错)。

  • question_id:int,FK到tbl_question id
  • answer_option:tinyint(1) / char(1),一组单个问题的可选答案
  • 回答:text
  • is_correct:tinyint(1) / byte(1)(标记正确答案)

使question_idanswer_option成为复合PK。现在,您可以通过id / question_id加入这两个表,并获得单个问题的所有可选答案。只需确保其中一个标记为正确。


我会发布这个答案,虽然你在我写这篇文章时已经接受了答案。像tombom说的那样,你有一个FK建立错误的方式。

通过询问有关使用连接设置表的教程,不确定您的意思。您应该首先熟悉外键的概念,然后您可以按照自己喜欢的方式加入表格。这里有几个链接。

FK的概念非常简单地是一个与另一个表上的列相关的列(通过使用外键列的值来连接两个或多个表)。只记得在这些表/值之间添加一个FK约束,这样当你尝试做一些破坏约束的事情时,RDBMS就会发出警告。就像这里当你试图为一个不存在的问题添加一个答案时。

最后,如果您担心参照完整性(就像每个数据库设计师/经理/管理员应该这样),请使用InnoDB。