15 MySQL 从入门到精通——触发器

文章展示了如何在MySQL中创建和使用触发器,包括在表操作前后的不同触发时间,以及如何维护冗余数据。示例涉及了创建表格、删除表格、插入和更新数据,特别强调了在商品销售和库存管理中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

示例库1
create table timelog(
id int(11) primary key auto_increment not null,
savetime varchar(50) not null
);

示例库2
DROP TABLE IF EXISTS `studentinfo`;
CREATE TABLE `studentinfo` (
  `sid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` int(1) DEFAULT '1',
  `tel` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  PRIMARY KEY (`sid`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

示例库3
create table timeinfo(
id int(11) primary key auto_increment,
info varchar(50) not null
);

购买商品信息示例库4
DROP TABLE IF EXISTS `tb_sell`;
CREATE TABLE `tb_sell` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goodsname` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `goodstype` int(11) DEFAULT NULL,
  `number` int(11) DEFAULT NULL,
  `price` decimal(10,2) DEFAULT NULL,
  `amount` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;



商品仓库示例库5
DROP TABLE IF EXISTS `tb_stock`;
CREATE TABLE `tb_stock` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goodsname` varchar(200) COLLATE utf8mb4_unicode_ci NOT NULL,
  `number` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
INSERT INTO tb_stock(goodsname,number) VALUES ('马克杯350ML',100);
MySQL触发器
	触发器: 是由MySQL的基本命令事件来触发的某种特定操作。
	创建只有一个执行语句的触发器:
		Usage:
			CREATE  TRIGGER  触发器名 BEFORE | AFTER 触发事件 ON 表名 FOR EACH ROW 执行语句
				#EACH ROW:遍历每一行
				#触发事件:insert/update/delete
		示例:表studentinfo在插入数据前会触发动作:同时向timelog表插入一条数据
			delimiter // 
			create trigger auto_save_time before insert 
			on studentinfo for each row
			insert into timelog(savetime) values(now());
			//
	创建具有多个执行语句的触发器
		Usage:
			CREATE TRIGGER 触发器名称 BEFORE | AFTER 触发事件
			ON 表名 FOR EACH ROW
			BEGIN 
			执行语句列表
			END	
			;	
		示例:删除记录,触发两条插入动作
			delimiter //
			create trigger delete_time_info after delete
			on studentinfo for each row
			begin
			insert into timelog(savetime) values (now());
			insert into timeinfo(info) values ('deleteact');
			end
			//														

查看触发器
	1.SHOW TRIGGERS\G
	2.查看 triggers表中触发器信息
		SELECT * FROM information_schema.triggers\G
使用触发器
	触发器的执行顺序
		BEFORE:表操作之前
		AFTER:表操作之后
	使用触发器维护冗余数据
		补充:mysql 触发器OLD和NEW关键字
			使用OLD和NEW关键字,能够访问受触发程序影响的行中的列(OLD和NEW不区分大小写)。在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。
			用OLD命名的列是只读的。你可以引用它,但不能更改它。对于用NEW命名的列,如果具有SELECT权限,可引用它。在BEFORE触发程序中,如果你具有UPDATE权限,可使用“SET NEW.col_name = value”更改它的值。这意味着,你可以使用触发程序来更改将要插入到新行中的值,或用于更新行的值。
			在BEFORE触发程序中,AUTO_INCREMENT列的NEW值为0,不是实际插入新记录时将自动生成的序列号。
			OLD和NEW是对触发程序的MySQL扩展。			
		示例:创建一个触发器,每当商品被卖出后插入tb_sell表卖出信息数据时,触发更新使仓库表tb_stock中的物品数量更新
			DELIMITER // 
			CREATE TRIGGER auto_number AFTER INSERT 
			ON tb_sell FOR EACH ROW
			BEGIN
			DECLARE sellnum int(10);
			SELECT number FROM tb_sell where id=NEW.id INTO @sellnum;
			UPDATE tb_stock SET number=number-@sellnum WHERE goodsname='马克杯350ML';
			END
			//							
			INSERT INTO tb_sell(goodsname,goodstype,number,price,amount) VALUES ('马克杯350ML',1,1,29.80,29.80);				
			SELECT * FROM tb_stock WHERE goodsname='马克杯350ML';				
删除触发器
	DROP TRIGGER 触发器名称;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值