MySQL:更新查找表

时间:2013-05-22 22:20:05

标签: mysql survey

在我的调查问题数据库(s_questions)和可能的答案(s_option_choices)中,我有一个查找表(s_question_options):

创建语法:

CREATE TABLE `s_question_options` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`questions_id` int(11) unsigned NOT NULL,
`option_choices_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`id`),
KEY `questions_id` (`questions_id`),
KEY `option_choices_id` (`option_choices_id`),
CONSTRAINT `s_question_options_ibfk_1` FOREIGN KEY (`questions_id`) REFERENCES `s_questions` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE,
CONSTRAINT `s_question_options_ibfk_2` FOREIGN KEY (`option_choices_id`) REFERENCES `s_option_choices` (`id`) ON DELETE NO ACTION ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=1790 DEFAULT CHARSET=utf8;

如此填充:

INSERT INTO s_question_options (questions_id, option_choices_id)
SELECT sq.id, so.id FROM s_questions sq
JOIN s_option_choices so
ON sq.option_groups_id = so.option_groups_id;

如果我使用新的/更改/删除的可能答案更新s_option_choices,那么将使用哪种语法更新我的查找表s_question_options,以便使当前问题可用但旧答案(存储在答案表中,以及通过s_question_options_id引用的)仍被正确引用?

修改

我可以使用以下命令将新问题或新的option_choices添加到我的查找表中:

INSERT INTO s_question_options (questions_id, option_choices_id)
SELECT sq.id, so.id FROM s_questions sq JOIN s_option_choices so
ON sq.option_groups_id = so.option_groups_id
WHERE sq.id NOT IN (SELECT questions_id FROM s_question_options)
OR so.id NOT IN (SELECT option_choices_id FROM s_question_options)

它与最初用于填充查找表的选择查询相同,但条件是a)之前未输入输入的问题,或b)之前未输入option_choice。

更改option_choices不应该是一个要求,它没有任何意义,并且在参照完整性游戏中没有地位。

删除option_choices可以通过我的答案表外键(id)ON DELETE SET NULL来解决。这实际上会将已删除的option_choice的问题的答案设置为NULL,并且在我的应用程序中,我可以查找并执行相应的操作(问题未得到回答,或者使用现在无关的数据进行回答)。

正如所建议的那样,还可以在option_choices表中设置一个显示标志(甚至是应用程序中的option_choices数组),这样可以防止这些option_choices在表单中显示但仍保留数据库中的数据。 / p>

Survey Database Design

2 个答案:

答案 0 :(得分:0)

这不是语法问题,这是数据库设计问题。

此处有两个主要数据集questionsoptions,它们之间具有多对多关系,基于{{{ 1}}。据推测,您可能会将答案存储在某个地方,可能存储在此数据库中,但可能完全存储在某些其他数据表单中。我们假设您根据上述查询使用option_groups_id存储答案。

为了保持历史答案的保真度,您需要某种方法将旧选项标记为“无效”。为此,您有两种选择:

  1. 通过制作新的question_option_id表格或向question_answers_old添加archivecurrent标记,将“旧答案”商店添加到您的数据库中

  2. 调整您存储在question_answers记录中的数据,使其同时包含answerquestion_id,而不只包含option_id

    < / LI>

    我的建议是,如果可行的话,#2。并使用视图替换上面的表格,除非性能要求您将其作为独立的表格。

答案 1 :(得分:0)

请参阅我的解决方案编辑:

INSERT INTO s_question_options (questions_id, option_choices_id)
SELECT sq.id, so.id FROM s_questions sq JOIN s_option_choices so
ON sq.option_groups_id = so.option_groups_id
WHERE sq.id NOT IN (SELECT questions_id FROM s_question_options)
OR so.id NOT IN (SELECT option_choices_id FROM s_question_options)
相关问题