我正在创建一个"日志(log)"系统,为此,触发器将是最好的方式,我认为.问题是我有一个标题表(表1)和一个行项目表(表2).我创建了两个新表(Table1log)和(Table2log),它们是非日志(log)表的副本.我希望当我更新头表(Table1)中的一行时,它会将当前行值存储在日志(log)表(Table1log)中,但我还希望将(Table2)中具有相同Header_id的每一行都存储到(Table2log)中.所以我创建了一个BEFORE UPDATE触发器,将更新的行保存到(表1)中的部分正在工作,但是当涉及到保存(表2)行时,它就不工作了.它说我不能从触发器返回结果集,也不能创建视图.

我try 使用普通的SELECT和INSERT,我希望它能起作用,但它返回以下内容 Error 1415: Not allowed to return a result set from a trigger SQL Statement

我还试图在触发器内创建一个视图,然后简单地从该视图中获取数据,但它返回了以下内容 Error 1422: Explicit or implicit commit is not allowed in stored function or trigger SQL Statement

我try 了所有关于这些话题的话题,但似乎都不是我想要的.

CREATE DEFINER='root'@'%' TRIGGER 'dev'.'table1_BEFORE_UPDATE' BEFORE UPDATE ON "table1" FOR EACH ROW
BEGIN
    INSERT INTO dev.table1log
      (NumHeader, Name)
      VALUES (OLD.NumHeader, OLD.Name);
    
    SELECT * INTO @table2v FROM dev.table2 WHERE NumHeader = OLD.NumHeader;
    
    INSERT INTO dev.table2log
      (NumHeader, Name)
      VALUES (@table2v.NumHeader, @table2v.Name);
END

我想做这样的事情,有没有人能告诉我应该怎么做?

推荐答案

您只能将MySQL作为变量用于单个标量,而不能用于结果集.

但在您的情况下不需要任何变量,因为您可以使用INSERT INTO ... SELECT.

CREATE DEFINER='root'@'%' TRIGGER dev.table1_BEFORE_UPDATE AFTER UPDATE ON table1 FOR EACH ROW
BEGIN
    INSERT INTO dev.table1log
      (NumHeader, Name)
      VALUES (OLD.NumHeader, OLD.Name);
    
    INSERT INTO dev.table2log
      (NumHeader, Name)
      SELECT NumHeader, Name
      FROM dev.table2
      WHERE NumHeader = OLD.NumHeader;
END

我还进行了编辑,将其更改为AFTER触发器,因为您希望它在生成触发器的更新成功后运行.如果在BEFORE触发器中执行插入操作,但更新失败,则它将不得不回滚更多更改.

我还修复了引号的不正确使用.

Mysql相关问答推荐

使用由其中一个表的列规定的条件连接两个表

Google Sheet查询以提取数据并用值替换复选框.(差异)

MySQL逻辑全部

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

MySQL 运行自动脚本

在 .NET 6 中使用 Dapper Framework 未能成功连接到 MySql

错误:此查询集包含对外部查询的引用,并且只能在子查询中使用

使用Workbench时如何添加mysqldump配置标志

将 Go var 传递给 MySQL - try 在 Go lang 程序 (MySQL db) 中执行 db.Exec 时出错

MYSQL除以零警告,奇怪的行为

MySQL - 考虑到所有前几天,每天计算唯一用户

如何显示患者预约中的专业人员姓名?

即使我的约束是正确的,如何解决 errno: 150 外键约束形成错误?

如何在 SQL 中的一行中查找最小值和最大值?

如何在特定数据库中创建表?

按日期和时间降序排序?

将 Blob 转换为字节数组的最简单方法

启用 NO_BACKSLASH_ESCAPES 选项时如何转义文字百分号?

如何从命令行调用带有参数的mysql存储过程?

'LIKE ('%this%' OR '%that%') and something=else' 不起作用