0

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

发生数据库错误

错误号:1452

无法添加或更新子行:外键约束失败 ( user_test. tblquestions, CONSTRAINT tblquestions_ibfk_5FOREIGN KEY ( QID) REFERENCES answers( ID) ON DELETE CASCADE ON UPDATE CASCADE)

插入tblquestions( Question, qA, qB, qC) 值 ('unikalus klausimas', 'unikalus atsakymas', 'unikalus atsakymas', 'unikalus atsakymas')

4

2 回答 2

1

外键基本上无非是“表中的条目必须在被引用表中具有相应值”的规则。

在您的情况下,逻辑是,不存在的问题无法得到答案。因此,您以错误的方式放置了外键。

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

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

于 2013-02-21T10:15:27.290 回答
0

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

这是一种方法。让我们使用两个表:tbl_question, tbl_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)(标记问题的正确答案)

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


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

不知道您通过询问有关设置带有联接的表的教程是什么意思。您应该首先熟悉外键的概念,然后您可以以任何您喜欢的方式加入您的表。这里有几个链接。

FK 的概念非常简单,是与另一个表上的列相关的列(您可以使用外键列的值连接两个或多个表)。只需记住在这些表/值之间添加 FK 约束,以便 RDBMS 在您尝试执行破坏约束的操作时向您发出警告。就像这里当你试图为一个不存在的问题添加答案时一样。

最后,如果您担心引用完整性,请使用 InnoDB(每个 DB 设计者/经理/管理员都应该这样做)。

于 2013-02-21T11:14:54.467 回答