【问题标题】:mysql create table based on columns from another table and auto updatedmysql 根据另一个表中的列创建表并自动更新
【发布时间】:2013-08-10 21:36:03
【问题描述】:

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

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

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

  • submitId 自动递增

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

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

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

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

【问题讨论】:

  • 听起来您想在提交表上实现某种触发器,但不清楚具体条件是什么。即插入?在更新?对于第二个表,操作是什么 - 插入?更新?
  • 当状态改变时,等更新。现在我尝试为地址、电子邮件和链接添加新列,然后添加到表 2

标签: mysql


【解决方案1】:

您想使用触发器。见:

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

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

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 ;  

【讨论】:

  • 谢谢@Ireeder 就是这样,现在更进一步,说在提交表上我有一个联系人和电子邮件列,然后我可以将该链接列添加到新表中,所以如果改变一切都得到更新。我该怎么做?
  • @Ireeded 它的行为不像预期的那样,它只是不断添加,我将如何检查 submit_id 是否已经存在并且仅在它不存在时添加?因为这样我就有重复
  • 您可以在 INSERT 上创建一个新触发器以在新表中创建初始记录,并在我的示例中修改 UPDATE 触发器以更新新表中 NEW.submit_id = submit_id 的行任何更新的列。我已经相应地更新了我的答案
【解决方案2】:

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

【讨论】:

  • 谢谢@Wirus 我欢迎评论,表格规范化是我一直试图理解的事情之一,我的想法是,提交将在线完成,所以把所有东西都放起来会更容易在一个表中(通过 php),然后一旦他们被接受,将添加额外的信息,studentId 将用于实际的学生 ID,所以我需要自动递增,这也给了我一个只有相关数据的“干净”表然后处理。但是,如果您能详细说明,我将不胜感激,也许您的权利,我可以以更好的方式做到这一点。谢谢
  • 让我了解您的情况。提交是研究领域的申请,对吧?如果有人接受提交,则给定的人将成为学生。我说的对吗?
  • 是的,你是对的,我想了很久,你是对的,模型是错误的(noob error...lol)因为学生可能会提交不同的课程,所以我想有一张包含学生详细信息(带有密码)的学生表来确认谁是谁,一张包含课程的表和一张谁被接受或不接受的表,这有意义吗?我还不知道我将如何将所有这些联系在一起,如果你能指出我将不胜感激的一个例子。附带问题:随着数据的添加,表连接的性能是否会非常费力?
  • 这是我在您确认我的疑问后想指出的——用户可能有多个接受的提交,但仍然是一个学生。因此,正如您所指出的,它应该关注学生的帐户,这将是提交课程的起点。因此,您将拥有 Student 和 Courses 表,现在您需要 StudentCourses 表,其中将包含 studentId、courseId、submissionDate、status 等。这就是您加入它的方式。
  • 不要担心连接性能,记住,mysql 是关系数据库——它是为关系设计的:)。对于表的主键 rdbms 自动创建索引,您可以在 StudentCourses.studentId 和 StudentCourses.courseId 字段上额外创建索引。
【解决方案3】:

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

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

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

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

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

Submission_log 表。 submission 表中每个事件一行。包含submission的所有字段加上它自己的主键(submission的主键在这里是外键),并包含一个指示字段表示它是代表对submission的插入还是更新>.

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

【讨论】:

  • 在 stackoverflow 上真正让我生气的是人们自己无法弄清楚一些事情,只是阅读其他答案和 cmets,对其进行一些修改,添加或多或少重要的内容并创建自己的答案基础关于收集到的信息,只是'点猎人'。对不起,伙计,但如果没有我花时间帮助和回答 Bob 的问题,你会像其他人一样,通过为这个损坏的模型创建触发器来帮助他。
  • 对不起,Wirus,并没有试图抢走任何人的风头。我什至不打算提供解决方案,只是提供思考的食物。老实说,正如我在上一段中总结的那样,我仍然不清楚 OP 的目标。
  • @rObjects,谢谢这就是我想要做的,理解它并找出最好的方法:)
  • @rObjects 我发布了一个新帖子,其中包含更多详细信息herefiddle,以更好地解释我想要做什么。
猜你喜欢
  • 1970-01-01
  • 2012-09-05
  • 1970-01-01
  • 2017-07-24
  • 2014-10-20
  • 2011-11-25
  • 2018-10-24
  • 1970-01-01
相关资源
最近更新 更多