1

我可以在这里使用“错误”的措辞(mysql 的新手),但我希望我已经解释了我正在努力做好的事情。

我有一个名为 submits 的表,其中包含 4 个字段 submitId、studentName、submitDate、status

  • 状态是指他们是否被录取。

  • submitId 自动递增

现在我想基于它创建另一个表,但只有当状态为真时,这个新表才会有 submitId、studentName、submitDate 以及其他字段。

  • 此表将有一个新的自动递增 studentId

我将如何做到这一点,它会自动更新第二个表上第一个表的任何新条目,但不会覆盖表 2 的附加内容。

我想过使用视图,但你不能在视图上添加新列,对吧?我这里的逻辑有错还是有什么选择,有人可以指出我正确的方向吗,谢谢

4

3 回答 3

1

您想使用触发器。看:

http://dev.mysql.com/doc/refman/5.6/en/triggers.html

您可以创建触发器,以便在submissions状态=true 的情况下插入一行时,它会在您的新学生表中插入一行。它看起来像这样:

delimiter //
CREATE TRIGGER sub_ins_check AFTER INSERT ON submissions
     FOR EACH ROW
     BEGIN
         IF NEW.status = 1 THEN
           INSERT INTO your_new_table (student_name, submit_date, submit_id) VALUES (NEW.student_name, NEW.submit_date, NEW.submit_id);
         END IF;
     END;//
delimiter ;  

然后创建另一个触发器,以便在提交中更新行时,它会更新新表中具有相同 submit_id 的行,如下所示:

delimiter //
CREATE TRIGGER sub_ins_check AFTER UPDATE ON submissions
     FOR EACH ROW
     BEGIN
         IF NEW.status = 1 THEN
           UPDATE your_new_table SET student_name = NEW.student_name, submit_date = NEW.submit_date, (etc..)) WHERE submit_id = NEW.submit_id;
         END IF;
     END;//
delimiter ;  
于 2013-08-10T21:43:23.237 回答
1

我认为您的数据模型是错误的。请记住,我有几个提交的学生,并且可能有许多同名的学生。你必须区分它们。您是否有任何理由要在两个表中复制学生数据?如果您不熟悉SQL,请先阅读有关表规范化的信息。在您Student的表格中,您应该存储学生数据并在Submission表格中 - 猜猜看:)

于 2013-08-11T06:42:42.560 回答
1

您需要做的第一件事是退后一步,从逻辑实体的角度考虑问题。

您已经确定了我可以看到的两个实体 - 学生和提交。“学生”是一个显而易见的实体,您可以选择不将其存储在数据库中,但这样做可能会更好。“提交”是更明显的一个,但不那么明显的是“提交”实际上什么。让我们假设它是某种交易。

您提到了“第二个表”,但没有明确指出它在解决方案中的作用。我能推断出的最好的结果是,它意味着某种针对提交的活动的历史轨迹。如果属实,那么我可以设想一个如下所示的物理模式:

学生桌。每名学生一排;包含有关学生的信息(姓名、身份证等)。主键可能是一个自动递增的数字。

提交表。每次提交一行;包括学生表的外键(引用主键);有自己的主键,也是一个自动递增的整数。还为 INSERT 和 UPDATE 定义了触发器。INSERT 触发器导致 INSERT 进入submit_log表;UPDATE 触发器也会导致 INSERT 插入到submit_log表中。

提交日志表。针对提交表的每个事件一行。包括所有提交的字段加上它自己的主键(这里提交的主键是外键),并包括一个指示字段,表示它是代表插入还是提交更新。

上述内容的目的不是提供解决方案,甚至不是解决方案的框架,而是让您根据要在解决方案中建模的逻辑实体以及它们之间的关系进行思考。当您对逻辑模型有了清晰的了解后,就可以更容易地确定需要哪些表、它们的角色、它们将如何使用以及它们将如何相互关联。

于 2013-08-11T18:38:36.380 回答