mysql触发器,获取被触发的行

本文介绍了如何在MySQL中使用触发器监听并同步表的行数据。通过创建源表`test_trigger`和目标表`test_update`,然后设置触发器,当`test_trigger`发生UPDATE操作时,触发器会将被更新的行数据复制到`test_update`中。

今天用到mysql的触发器,需要将被触发的行的数据沉淀到另一张表中,网上查了下资料,在此做个汇总,触发器的基本知识请参考:http://zhangjq5.iteye.com/admin/blogs/1893926

触发器建立在表的行上面,相当于对每行做监听,主要负责监听insert、delete和update操作,以update为例,

1、创建源数据表:

CREATE TABLE IF NOT EXISTS `test_trigger` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `insert_name` varchar(50) DEFAULT NULL,
  `insert_desc` varchar(50) DEFAULT NULL,
  `create_time` date DEFAULT NULL,
  `time_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='触发器测试';

 

 

2、创建目标数据表:

CREATE TABLE IF NOT EXISTS `test_update` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) DEFAULT NULL,
  `create_time` date DEFAULT NULL,
  `time_at` timestamp NUL

### 如何在 MySQL 触发器获取修改前的数据 在 MySQL 中,触发器是一种特殊的数据库对象,它可以在执 `INSERT`、`UPDATE` 或 `DELETE` 操作之前或之后自动运一段代码。当涉及到 `UPDATE` 操作时,可以通过两个临时表来访问被修改数据的状态: - **OLD 关键字**:用于表示正在更新的记录的原始值(即修改前的数据)。 - **NEW 关键字**:用于表示即将写入到数据库中的新值。 如果需要在触发器获取修改前的数据,则可以利用 `OLD` 来实现这一目标[^1]。 以下是创建一个基于 `UPDATE` 的触发器示例,该触发器会在每次更新某条记录时捕获其旧电话号码并将其存储在一个审计日志表中: ```sql -- 创建一张用户表 users CREATE TABLE IF NOT EXISTS users ( user_id INT PRIMARY KEY, phone VARCHAR(20) ); -- 创建一张审计日志表 audit_log CREATE TABLE IF NOT EXISTS audit_log ( log_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT, old_phone VARCHAR(20), update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 定义触发器 before_update_user,在更新 users 表之前执 DELIMITER $$ CREATE TRIGGER before_update_user BEFORE UPDATE ON users FOR EACH ROW BEGIN INSERT INTO audit_log (user_id, old_phone) VALUES (OLD.user_id, OLD.phone); END$$ DELIMITER ; ``` 上述脚本完成以下功能: 1. 当对 `users` 表发起一次 `UPDATE` 请求时,会先激活名为 `before_update_user` 的触发器; 2. 此触发器通过 `OLD.phone` 获取当前记录原有的电话号码,并将此信息连同对应的用户 ID 插入至 `audit_log` 表中作为历史记录保存下来。 关于 `NULL` 值处理方面需要注意的是,SQL 标准规定任何涉及 `NULL` 的比较都会返回未知结果而非简单的真/假布尔值。因此建议采用专门针对这种情况设计的方法来进判断,比如使用函数 `IS NULL` 和 `IS NOT NULL` 而不是普通的等号运算符[^2]。 #### 示例场景扩展说明 假设现在有如下需求——每当用户更改他们的联系方式时都需要通知管理员;但如果只是单纯把字段置为空(`NULL`)则无需发送提醒邮件。那么我们就可以借助上面提到的知识点构建解决方案如下所示: ```sql DELIMITER $$ CREATE TRIGGER notify_admin_on_contact_change AFTER UPDATE ON users FOR EACH ROW BEGIN IF NEW.phone IS NOT NULL AND OLD.phone <> NEW.phone THEN -- 这里放置实际的通知逻辑,例如调用外部API或者插入消息队列等等... SIGNAL SQLSTATE '01000' SET MESSAGE_TEXT = 'Contact information changed'; END IF; END$$ DELIMITER ; ``` 这里的关键在于条件语句部分,其中不仅验证了新的手机号码确实存在而且还要确保前后两次取值不同才会触发后续动作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值