Mysql触发器

本文主针对小白:如何在数据库有数据变动得时候及时得到内容。

MySQL触发器(Triggers)是一种数据库对象,它在指定的事件(例如插入、更新或删除数据)发生时自动执行一系列预定义的操作。触发器通常用于实施业务规则、数据完整性约束和自动化任务。

下面是MySQL触发器的一般语法:

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
FOR EACH ROW
trigger_body

其中:

  • trigger_name 是触发器的名称,你可以自定义。
  • BEFOREAFTER 关键字表示触发器在指定事件之前或之后执行。
  • INSERTUPDATEDELETE 关键字表示触发器与哪种操作相关联。
  • table_name 是触发器所在的表名。
  • FOR EACH ROW 表示触发器将为每个受影响的行执行。
  • trigger_body 是触发器的具体操作代码,可以包含一系列的SQL语句。

 要查看已创建的触发器列表,可以使用以下命令:

SHOW TRIGGERS;

删除触发器,可以使用以下语法:

DROP TRIGGER IF EXISTS trigger_name;

请注意,在MySQL中,触发器的使用可能受到特定版本和配置的限制。在创建和使用触发器之前,请确保你有足够的权限,并且了解数据库的配置和限制。

下面是一个示例,展示如何创建一个触发器,使得对表 testAINSERTUPDATEDELETE 操作能够同步到 testB 表:

-- 创建触发器,同步插入操作
CREATE TRIGGER sync_insert_testA_to_testB
AFTER INSERT ON testA
FOR EACH ROW
BEGIN
    INSERT INTO testB (column1, column2, column3)
    VALUES (NEW.column1, NEW.column2, NEW.column3);
END;

-- 创建触发器,同步更新操作
CREATE TRIGGER sync_update_testA_to_testB
AFTER UPDATE ON testA
FOR EACH ROW
BEGIN
    UPDATE testB
    SET column1 = NEW.column1, column2 = NEW.column2, column3 = NEW.column3
    WHERE id = OLD.id;
END;

-- 创建触发器,同步删除操作
CREATE TRIGGER sync_delete_testA_to_testB
AFTER DELETE ON testA
FOR EACH ROW
BEGIN
    DELETE FROM testB WHERE id = OLD.id;
END;

这个示例创建了三个触发器:

  • sync_insert_testA_to_testB 触发器在每次向 testA 表中插入新行后,将相应的数据插入到 testB 表中。
  • sync_update_testA_to_testB 触发器在每次更新 testA 表中的行后,将相应的数据更新到 testB 表中。
  • sync_delete_testA_to_testB 触发器在每次从 testA 表中删除行后,将相应的数据从 testB 表中删除。

请根据你的实际需求修改触发器的逻辑和字段映射。

NEW OLD 是固定的关键字,用于引用触发器操作中的新数据和旧数据。

  • NEW 表示触发器操作中的新数据,通常用于插入和更新操作。你可以通过 NEW.column_name 的形式来引用 NEW 中的特定列。
  • OLD 表示触发器操作中的旧数据,通常用于更新和删除操作。你可以通过 OLD.column_name 的形式来引用 OLD 中的特定列。

这些关键字用于访问触发器操作所涉及的行的数据。NEW 包含新插入或更新的行的值,而 OLD 包含旧的被更新或删除的行的值。

之前提供的示例中,NEW.column1 是指 testA 表中插入或更新操作中的 column1 列的值。

请注意,使用 NEWOLD 关键字时,你需要确保触发器与其所关联的表具有相同的列结构,否则可能会导致错误。

现阶段使用 JAVA / Springboot 还无法被动接收触发器处理的事件,代码层要获取,可引用示例,通过触发器,将表变动数据保留到临时表上,并在原有列字段基础上新增列信息提示,如 :

  • data_type:数据类型:0-默认,1-插入,2-更新,3-删除 ,
  • data_dispose:数据处理情况:0-未处理,1-已处理

然后定时读取数据(临时)表中新增且未处理的数据在代码业务中进行同步。

(一般使用场景是访问第三方数据库并需要将对方数据同步到本地库中,但触发器语句需要到对方库执行,所以权限比较重要)

上述采用新增列来记录新数据变化情况,而不考虑临时表的原有数据直接修改,主要从两个方面考虑:

1、新增的效率比修改的效率快,修改操作涉及到锁。

2、如果在临时表原有数据上变更,查询被编辑的列比较麻烦,而且删除操作还找不到数据了。

上次示例的删除操作可修改为:

-- 创建触发器,同步删除操作
CREATE TRIGGER sync_delete_testA_to_testB
AFTER DELETE ON testA
FOR EACH ROW
BEGIN
    INSERT INTO testB (id , data_type, data_dispose, column3)
    VALUES (OLD.id, 3, 0,  NEW.column3);
END;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值