通过在第三张表上插入而触发将行从一张表复制到另一张表

时间:2019-01-21 10:08:16

标签: mysql database database-trigger

在我的数据库中,有四个表:tasktasknotestask_archivetasknotes_archive。将条目从task表复制到task_archive表时,我想使用触发器执行以下操作:

  1. 将相关任务说明从tasknotes表复制到tasknotes_archive表。
  2. 删除我刚刚复制到task的{​​{1}}表中的条目
  3. 从我刚复制到task_archive的{​​{1}}中删除条目

与数据库连接的应用程序是使用JDBC在Java中构建的。我可以通过对数据库的一系列调用或作为事务来实现上述结果。但是,使用初始插入语句似乎比将行从task复制到task_archive触发其余事件更有效。最初,我通过查看是否可以根据插入task_archive来触发从任务表中删除条目来进行测试。这似乎工作正常。但是,当我开始尝试添加脚本以使DB从任务说明复制到tasknotes_archive时,我收到了错误消息,指出它在第一个where子句中无法识别task_archive.task_id。重要的是,tasknotes和tasknotes_archive具有完全相同的表结构,因此,该插入方法应该是可行的,如对此问题的回答:MYSQL: How to copy an entire row from one table to another in mysql with the second table having one extra column?中所讨论的。然后,我根据堆栈上其他问题的答案尝试将其更改为new.task_id。仍然收到错误消息。以下代码是task_archive中包含的插入触发器,我应该尝试开发该触发器以对tasknotes_archive和task执行上述操作:

tasknotes

我的问题是,是否有可能使多个事件作为触发来运行?我是否认为这是执行此操作的有效方式,而不是多次调用Java中的DB?最后,编写此触发器的正确​​方法是什么?

1 个答案:

答案 0 :(得分:1)

您需要使用NEW.task_id来获取与触发器的当前行相关的任务。

如果使用CLI进行此操作,则需要DELIMITER语句,以便可以在触发器中的语句之间使用;

DELIMITER $$

CREATE
TRIGGER `myDB`.`task_archive_AFTER_INSERT`
AFTER INSERT ON `myDB`.`task_archive`
FOR EACH ROW
BEGIN
    INSERT INTO tasknotes_archive
    SELECT tasknotes.* FROM tasknotes
    WHERE tasknotes.task_id = NEW.task_id;

    DELETE task, tasknotes
    FROM task JOIN tasknotes USING (task_id)
    WHERE task.task_id = NEW.task_id;
END
$$
DELIMITER ;