MySQL触发器(Trigger)详解及使用

MySQL触发器(Trigger)详解及使用

触发器(Trigger)是MySQL数据库提供的一种数据库对象,用于在对表数据进行更改(插入、修改、删除)时自动执行预先定义的动作。语法如下:

create trigger trigger_name
[before|after] [insert|update|delete] on table_name for each row
begin
	---trigger action
end;

在SQL中,我们可以使用new得到修改后的row,使用old得到修改前的row。通过new、old可以获取具体的字段,比如:new.username可以得到修改后的username,old.username可以得到修改前的username。

触发器通常有以下两个作用:

  • 自动化任务(自动记录表数据变化日志、生成统计信息)
  • 数据验证(可以在数据更新时验证数据的完整性和正确性)

以下我们就拿根据表数据变化记录变化日志为例子,深入学习一下。
先来创建测试需要的数据表:

create table user_info(
	user_id int auto_increment primary key,
	username varchar(100),
	email varchar(100)
);

创建日志表记录user_info表数据变化:

CREATE TABLE user_operation_log (
    id INT AUTO_INCREMENT PRIMARY KEY,
    operation_type ENUM('INSERT', 'UPDATE', 'DELETE') NOT NULL,
    operation_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    user_id INT,  -- 假设你的用户表有 user_id 字段
    operation_data JSON
);

首先我们添加一个监控往user_info表添加数据的触发器:

create trigger user_insert
after insert on user_info for each row
begin
	insert into user_operation_log(operation_type, user_id, operation_data)
	values(
		'insert',
		new.user_id,
		JSON_OBJECT(
			'user_id', new.user_id,
			'username', new.username,
			'email', new.email
		)
	);
end;

接下来,我们添加一个监控user_info表数据修改的触发器:

create trigger user_update
after update on user_info for each row
begin
	insert into user_operation_log(operation_type, user_id, operation_data)
	values(
		'update',
		new.user_id,
		JSON_OBJECT(
			'old', JSON_OBJECT(
				'user_id', old.user_id,
				'username', old.username,
				'email', old.email
			),
			'new',JSON_OBJECT(
				'user_id', new.user_id,
				'username', new.username,
				'email', new.email
			)
		)
	);
end;

剩下的就是监控user_info表数据删除的触发器:

create trigger user_delete
after delete on user_info for each row
begin
	insert into user_operation_log(operation_type, user_id, operation_data)
	values(
		'delete',
		old.user_id,
		JSON_OBJECT(
			'user_id', old.user_id,
			'username', old.username,
			'email', old.email
		)
	);
end;

说明:我将数据表对象转换成json字符串,这样更通用,更合理一些。

以上就是本文全部内容,如果文章对你有所帮助,那实在是太好了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值