gpt4 book ai didi

mysql - 如何修复错误 1452 并正确关联表

转载 作者:行者123 更新时间:2023-11-30 21:30:34 25 4
gpt4 key购买 nike

我正在创建一个在线考试系统。在数据库中,我似乎无法正确关联我的表并导致出现错误。当我将数据提交到 tbl_choices 表时,我收到错误 1452。知道该怎么做吗?

我已经尝试在 sql 和关系 View 中执行它,但似乎不起作用。我还观看了几个关于使用外键创建表和更改表的视频。

tbl_qtopic

tbl_question

tbl_choices

tbl_qtopic:

CREATE TABLE `tbl_qtopic` (
`topic_id` int(11) NOT NULL,
`topic_name` varchar(255) CHARACTER SET latin1 NOT NULL,
`description` varchar(255) CHARACTER SET latin1 NOT NULL,
`date_created` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

tbl_question:

CREATE TABLE `tbl_question` (
`ques_id` int(11) NOT NULL,
`topic_id` int(11) NOT NULL,
`ques` varchar(255) CHARACTER SET latin1 NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `tbl_question`
ADD CONSTRAINT `fk_question` FOREIGN KEY (`topic_id`) REFERENCES `tbl_qtopic` (`topic_id`) ON DELETE NO ACTION ON UPDATE CASCADE;
COMMIT;

tbl_choice:

CREATE TABLE `tbl_choices` (
`ch_id` int(11) NOT NULL,
`ques_id` int(11) NOT NULL,
`ques` varchar(255) CHARACTER SET latin1 NOT NULL,
`ch_des1` varchar(255) CHARACTER SET latin1 NOT NULL,
`ch_des2` varchar(255) CHARACTER SET latin1 NOT NULL,
`ch_des3` varchar(255) CHARACTER SET latin1 NOT NULL,
`ch_des4` varchar(255) CHARACTER SET latin1 NOT NULL,
`ans` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

ALTER TABLE `tbl_choices`
ADD CONSTRAINT `fk_choices` FOREIGN KEY (`ques_id`) REFERENCES `tbl_question` (`ques_id`) ON DELETE NO ACTION ON UPDATE CASCADE;

这是错误信息。

Error Number: 1452

Cannot add or update a child row: a foreign key constraint fails (`examsystem`.`tbl_choices`, CONSTRAINT `fk_choices` FOREIGN KEY (`ques_id`) REFERENCES `tbl_question` (`ques_id`) ON DELETE NO ACTION ON UPDATE CASCADE)

INSERT INTO `tbl_choices` (`ques`, `ch_des1`, `ch_des2`, `ch_des3`, `ch_des4`, `ans`) VALUES ('What does \'SQL\' stands for?', 'Super Query Language', 'Standard Query Language', 'Structured Query Language', 'Structured Question Language', '3')

最佳答案

外键基本上表示,对于具有外键的表(子表)中的每个条目,引用表(父表)中都需要有一个条目。可以说,它可以防止没有 parent 的 child 。

这意味着,您必须以正确的顺序插入,在您的情况下,首先需要在 tbl_qtopic 中有一个可以在 tbl_question 中引用的条目。然后,您在 tbl_question插入,以便可以在 tbl_choices 中引用此条目。

为了轻松完成此操作,您应该有一个主键,它也是一个 auto_increment 列。另请注意,您的表中应该始终有一个主键。

您的表格应该如下所示:

CREATE TABLE `tbl_qtopic` (
`topic_id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`topic_name` varchar(255) CHARACTER SET latin1 NOT NULL,
`description` varchar(255) CHARACTER SET latin1 NOT NULL,
`date_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

CREATE TABLE `tbl_question` (
`ques_id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
`topic_id` int(11) NOT NULL,
`ques` varchar(255) CHARACTER SET latin1 NOT NULL,
CONSTRAINT `fk_question` FOREIGN KEY (`topic_id`) REFERENCES `tbl_qtopic` (`topic_id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

然后您只需在事务中执行插入操作。一个事务捆绑了多个语句,因此如果一个语句失败,事务中的所有语句都将被撤消(回滚)。每次插入后,您保存在 auto_increment 列中生成的 id 并将此值用于下一个 insert 语句。

请注意,这只是 MySQL 代码。您必须查看如何使用 PHP 或您自己使用的任何工具执行此操作。我是数据库管理员,不是程序员 :)

START TRANSACTION;
INSERT INTO tbl_qtopic (topic_name, description) VALUES ('foo', 'bar');
SELECT LAST_INSERT_ID(); /* store this value in a variable */
INSERT INTO tbl_question (topic_id, ques) VALUES (<the value from above select>, 'baz');
COMMIT;

我猜你明白了。请注意,您不需要 insert 语句中的 auto_increment 列。这些值是自动生成的。我在示例中故意遗漏了表 tbl_choices,因为它需要重新设计。 ch_des 没有多个列(我猜是“选择描述”?)。那是糟糕的设计。如果一个问题有 5 个选择怎么办?如果一个人只有3个怎么办?您是否添加了一列并且在某些列中有几行具有 NULL 值?使这些列成为行。您不需要强制表之间的 1:1 关系。阅读有关数据库规范化的内容!ans 列应该是问题的正确答案?它可能不应该出现在这张表中,尤其是当您可以将问题选择为行而不是列时。表的设计是一个很大的话题,在这个问题中无法回答。如果您需要这方面的帮助,请打开另一个问题。

最后,给大家一些文献:

关于mysql - 如何修复错误 1452 并正确关联表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56473237/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com