在我的调查问题数据库(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>
答案 0 :(得分:0)
这不是语法问题,这是数据库设计问题。
此处有两个主要数据集questions
和options
,它们之间具有多对多关系,基于{{{ 1}}。据推测,您可能会将答案存储在某个地方,可能存储在此数据库中,但可能完全存储在某些其他数据表单中。我们假设您根据上述查询使用option_groups_id
存储答案。
为了保持历史答案的保真度,您需要某种方法将旧选项标记为“无效”。为此,您有两种选择:
通过制作新的question_option_id
表格或向question_answers_old
添加archive
或current
标记,将“旧答案”商店添加到您的数据库中
调整您存储在question_answers
记录中的数据,使其同时包含answer
和question_id
,而不只包含option_id
。
我的建议是,如果可行的话,#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)