首页 > 解决方案 > 将行从一个表复制到另一个由第三个表上的插入触发

问题描述

在我的数据库中有四个表:tasktasknotes和。当一个条目从表复制到表时,我想使用触发器来执行以下操作:task_archivetasknotes_archivetasktask_archive

  1. 将表中的相关任务笔记复制tasknotestasknotes_archive表中。
  2. 删除task我刚刚复制到的表中的条目task_archive
  3. 删除tasknotes我刚刚复制到的条目tasknotes_archive

与数据库接口的应用程序是使用 JDBC 在 Java 中构建的。我可以通过对数据库的一系列调用或作为事务来实现上述结果。但是,使用初始插入语句似乎比将行从任务复制到 task_archive 触发其余事件更有效。我最初通过查看是否可以获得触发器来根据插入到 task_archive 中删除任务表中的条目来测试这一点。这似乎工作正常。但是,当我开始尝试添加脚本以使数据库从 tasknotes 复制到 tasknotes_archive 时,我收到错误消息,指出它在第一个 where 子句中无法识别 task_archive.task_id。重要的,MYSQL:如何在mysql中将整行从一个表复制到另一个表,而第二个表有一个额外的列?. 然后,我尝试根据堆栈上其他问题的答案将其更改为 new.task_id。仍然收到错误消息。以下代码是 task_archive 中包含的插入触发器,我应该尝试开发它来对 tasknotes_archive 和任务执行上述操作:

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 = task_archive.task_id;

DELETE FROM task
USING task, task_archive
WHERE task.task_id = task_archive.task_id;
END

我的问题是,是否可以将多个事件作为所描述的触发器运行?我是否正确假设这是一种更有效的执行方式,而不是在 java 中多次调用数据库?最后,写这个触发器的正确​​方法是什么?

标签: mysqldatabasedatabase-trigger

解决方案


您需要使用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 ;

推荐阅读