我正在开发一个项目,要求我在phpMyAdmin中使用外键。我在两个表上设置了外键。 tblquestions
已链接到answers
表,但当我尝试将数据插入tblquestions
时,我收到此错误
发生数据库错误
错误号码:1452
无法添加或更新子行:外键约束失败 (
user_test
。tblquestions
,CONSTRAINTtblquestions_ibfk_5
外国 KEY(QID
)引用answers
(ID
)ON更新级联更新 CASCADE)INSERT INTO
tblquestions
(Question
,qA
,qB
,qC
)价值观 ('unikalus klausimas','unikalus atsakymas','unikalus atsakymas', 'unikalus atsakymas')
答案 0 :(得分:1)
外键基本上只是规则"表中的条目必须在引用的表中具有相应的值"。
在你的情况下,逻辑是,不存在对不存在的问题的答案。所以你用错误的方式把外键拿出来。
然后,当您插入数据时,您必须先插入问题的行。插入答案的行时,必须查找答案所属问题的ID。
顺便说一句,请忽略Yogesh Suthar的评论。外键是确保数据完整性的数据库的一个非常重要的功能,显然他不知道他在说什么。
答案 1 :(得分:0)
如果您已将tblquestions
与answers
相关联,则应首先添加答案,然后再添加问题。否则,由于您尝试在父级之前添加子级,因此无法保持参照完整性。 (始终在孩子之前添加父母。)
这是一种方法。让我们使用两个表:tbl_question
,tbl_answer
。
tbl_question
至少有两列:
int
text
tbl_answer
包含可能正确的答案(如果您想在一个问题中添加一组可选答案,则会出错)。
int
,FK到tbl_question
id
tinyint(1)
/ char(1)
,一组单个问题的可选答案text
tinyint(1)
/ byte(1)
(标记正确答案)使question_id
和answer_option
成为复合PK。现在,您可以通过id
/ question_id
加入这两个表,并获得单个问题的所有可选答案。只需确保其中一个标记为正确。
我会发布这个答案,虽然你在我写这篇文章时已经接受了答案。像tombom说的那样,你有一个FK建立错误的方式。
通过询问有关使用连接设置表的教程,不确定您的意思。您应该首先熟悉外键的概念,然后您可以按照自己喜欢的方式加入表格。这里有几个链接。
FK的概念非常简单地是一个与另一个表上的列相关的列(通过使用外键列的值来连接两个或多个表)。只记得在这些表/值之间添加一个FK约束,这样当你尝试做一些破坏约束的事情时,RDBMS就会发出警告。就像这里当你试图为一个不存在的问题添加一个答案时。
最后,如果您担心参照完整性(就像每个数据库设计师/经理/管理员应该这样),请使用InnoDB。