gpt4 book ai didi

mysql - 通过在第三个表上插入触发将行从一个表复制到另一个表

转载 作者:行者123 更新时间:2023-11-29 09:53:45 25 4
gpt4 key购买 nike

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

  1. 将相关任务注释从 tasknotes 表复制到 tasknotes_archive 表。
  2. 删除我刚刚复制到 task_archivetask 表中的条目
  3. 删除我刚刚复制到 tasknotes_archivetasknotes 条目

与数据库交互的应用程序是使用 JDBC 用 Ja​​va 构建的。我可以通过对数据库的一系列调用或作为事务来实现上述结果。然而,使用初始插入语句似乎比将行从任务复制到任务存档触发其余事件更有效。我最初对此进行了测试,看看是否可以获得一个触发器,根据插入到 task_archive 中的内容从任务表中删除条目。这看起来效果很好。但是,当我开始尝试添加脚本以使数据库从tasknotes复制到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执行上述操作:

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 ;

关于mysql - 通过在第三个表上插入触发将行从一个表复制到另一个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54287592/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com