首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MySQL/MariaDB -插入后删除与指定条件触发器匹配的行

MySQL/MariaDB -插入后删除与指定条件触发器匹配的行
EN

Stack Overflow用户
提问于 2020-10-07 01:54:33
回答 1查看 376关注 0票数 0

我有一个审计表,它存储与用于ETL进程的中间表相关的信息。我在父表中有一个触发器,该触发器存储对审计表中特定行执行的操作。

代码语言:javascript
运行
复制
CREATE TABLE `audit_table` (
  `RowID` bigint(20) NOT NULL,
  `apptid` bigint(20) NOT NULL,
  `modified` bigint(20) NOT NULL,
  `type` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `data_push_id` bigint(20) NOT NULL,
  PRIMARY KEY (`RowID`,`apptid`,`type`,`data_push_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  • 来自父表的RowID - PK;主表中的这个PK值是AUTO_INCREMENT
  • 父表中的apptid - PK
  • 上次修改行时的Unix时间戳
  • 键入-执行的操作;可以是“插入”或“删除”。
  • data_push_id --指父表中的列,该列包含上次将数据向上插入父表的批处理id。因此,data_push_id 1可以引用父表中的某一组记录,data_push_id 2可以引用另一组记录,依此类推。

我想做的是:

  • 在审计表中插入“删除”条目后.
  • 如果有一个“插入”条目具有相同的行号.
  • 插入“删除”行..。
  • 然后,立即删除该行号的"insert“和" delete”行。

这是我最初的尝试,但它返回了一个错误:

代码语言:javascript
运行
复制
CREATE TRIGGER IF NOT EXISTS `test` AFTER Insert ON 
        `audit_table` FOR EACH ROW
        IF (OLD.`rowid` = NEW.`rowid` AND NEW.`type` = 'Delete' AND OLD.`type` = 'Insert')
        DELETE FROM `audit_table` duap_audit WHERE duap_audit.rowid = OLD.rowid 

SQL Error [1363] [HY000]: (conn=18464) There is no OLD row in on INSERT trigger

我做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2020-10-07 02:08:23

只有更新前或更新后的触发器才有旧行。

插入触发器只有一个新行,这是清楚的,它们没有要替换的旧值。

在插入触发器中,只能使用NEW.col_name;没有旧行。在DELETE触发器中,只能使用OLD.col_name;没有新行。在更新触发器中,可以在行更新之前使用OLD.col_name引用行的列,在行更新后使用NEW.col_name引用行的列。

见手册

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64236124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档