mysql - 将行从一个表复制到另一个由第三个表上的插入触发
问题描述
在我的数据库中有四个表:task
、tasknotes
和。当一个条目从表复制到表时,我想使用触发器来执行以下操作:task_archive
tasknotes_archive
task
task_archive
- 将表中的相关任务笔记复制
tasknotes
到tasknotes_archive
表中。 - 删除
task
我刚刚复制到的表中的条目task_archive
- 删除
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 中多次调用数据库?最后,写这个触发器的正确方法是什么?
解决方案
您需要使用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 ;
推荐阅读
- python - 忽略夹层中压缩的外部源
- php - 在php中使用延迟睡眠等待的时间函数?
- jquery - 添加块表单对话框中的jQuery字体选择器提交表单而不是选择字体
- python - Numpy分段函数在scipy quad中很慢
- swift - Swift - 修改变量
- spring-boot - 如何为 Thymeleaf 激活不同的日志记录级别?
- c++ - 检查 Boost Interprocess managed_shared_memory 是否已经存在?
- bash - 使用 bash 4 语法将 Makefile 中字符串的首字母大写
- matlab - 如何找到 R、G、B、H、S、V 值
- r - 是否可以从使用 `facet_wrap` 的 `ggplots` 中获取`轴中断`?