我正在开展一个测验项目,我希望以这样的方式创建一个mysql结构:
questionID:唯一的问题标识号(主键)
testID:唯一的测试标识号(问题属于此测试)(主键)
questionOrder:测验问题中问题的顺序,即此问题是测验中的第n个问题。我希望这个值来自mysql,所以当我向db插入一个新问题时,我不必计算它
一个问题可以是多个不同的测试。
我有几个问题:
1)我有以下代码,但我得到:
表定义不正确;只能有一个自动列,必须将其定义为键
我怎样才能解决这个问题?
2)此结构不允许问题属于多个测验。有没有想过要避免这个?
3)你认为这种结构是好的/最佳的,你能提出更好的建议吗?
CREATE TABLE `quiz_question` (
`questionID` int(11) NOT NULL auto_increment,
`quizID` int(11) NOT NULL default '0',
`questionOrder` int(11) NOT NULL AUTO_INCREMENT,
`question` varchar(256) NOT NULL default '',
`answer` varchar(256) NOT NULL default '',
PRIMARY KEY (`questionID`),
UNIQUE KEY (`quizID`, `questionOrder`),
KEY `par_ind` (`quizID`, `questionOrder`)
) ENGINE=MyISAM;
ALTER TABLE `quiz_question`
ADD CONSTRAINT `0_133` FOREIGN KEY (`quizID`) REFERENCES `quiz_quiz` (`quizID`);
CREATE TABLE `quiz_quiz` (
`quizID` int(11) NOT NULL auto_increment,
`topic` varchar(100) NOT NULL default '',
`information` varchar(100) NOT NULL default '',
PRIMARY KEY (`quizID`)
) ENGINE=MyISAM;
感谢您阅读本文。
答案 0 :(得分:1)
从questionOrder字段中删除AUTO_INCREMENT
。
只要让MySQL在questionOrder字段中设置值,然后在后续的UPDATE查询中执行该操作。通常,您希望使用管理实用程序的测试管理员能够调整问题的顺序。在这种情况下,您只需输入比最高先前排序值(在该测试中)高+1的初始值。然后,你可以让它们像调整Netflix队列一样调整它:)
答案 1 :(得分:1)
1)订单会自行增加。只有当它是PK的一部分时,DB才会这样做。您可以通过制作包含订单列的复合键来破解它,但这不值得。
2)将quiz_question重命名为问题(并将quiz_quiz重命名为quiz)。创建一个名为quiz_question的新测验问题连接表。它应该有一个测验ID和一个问题ID,将测验与问题联系起来。由于同一问题在不同的问题上会有不同的顺序,会将问题顺序放在新的问答项上。您不再需要问题表上的测验ID。
答案 2 :(得分:1)
1)每个表只能有一个AUTO_INCREMENT列。它应该是关键。一般来说,它是PK的一部分。
2)'测验'将是由问题组成的实体。你应该有3个表: 1 - quiz_question:quest_id,问题,答案 2 - quiz_quiz:quiz_id,主题,信息 3 - quiz_fact:quiz_id,quest_id,quest_order
测验和问题表包含每项(测验/问题)信息。 quiz_fact定义了测验的组成方式(此测验按此顺序有此问题)。
3)我唯一的建议是改用Drizzle; )说真的,玩弄东西 - “足够好”经常是。如果它符合您的需求,为什么要修补?否则,一旦你完成并运行,你可以提出更详细的问题(即我的查询在这样的操作上太慢了。)