在我的数据库中,有四个表:task
,tasknotes
,task_archive
和tasknotes_archive
。将条目从task
表复制到task_archive
表时,我想使用触发器执行以下操作:
tasknotes
表复制到tasknotes_archive
表。 task
的{{1}}表中的条目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?最后,编写此触发器的正确方法是什么?
答案 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 ;