距离小红老师的《数据库原理》课程已经有一年了,增删改查大家肯定还记得,但是触发器估计忘得差不多了吧(至少我是还给小红老师了),下面通过一个例子来复习一下触发器trigger的知识。
一、触发器的定义
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。其定义伪代码如下:
DELIMITER ||
CREATE TRIGGER trigger_name trigger_time trigger_event
ON table_name FOR EACH ROW
BEGIN
trigger_statement;
...;
...;
END
||
DELIMITER ;
释义:
DELIMITER ||:将结束符号变成||,避免与trigger_statement中的分行符;冲突
trigger_name:触发器名称
tirgger_time:触发时机:BEFORE,即事件之前或者AFTER,即事件之后
trigger_event:触发事件:INSERT、DELETE或者UPDATE
table_name:表示建立触发器的表名,即在哪张表上建立触发器
FOR EACH ROW:表示任何一条记录上的操作满足触发事件都会触发该触发器
trigger_statement:触发器的程序体,可以是一条SQL语句或者多条语句
||:表示触发器创建完成
DELIMITER ;:触发器创建完成后,将结束符号还原回;
二、触发器创建实例
-- 创建数据库
create database book_test;
use book_test;
-- 创建图书信息表
create table bookinfo(
book_id int primary key auto_increment,
book_name varchar(20) not null,
price float(6,2) not null,
public_date date not null,
store int not null
);
-- 插入图书数据
insert into bookinfo(book_name,price,public_date,store) values('Android移动应用开发',39.8,'2021-12-26',6);
insert into bookinfo(book_name,price,public_date,store) values('Java程序设计',56.2,'2011-12-26',15);
insert into bookinfo(book_name,price,public_date,store) values('算法与数据结构',20,'2015-02-10',18);
select * from bookinfo
-- 创建日志数据表
CREATE TABLE `logs` (
`Id` int(11) NOT NULL AUTO_INCREMENT,
`log` varchar(255) DEFAULT NULL COMMENT '日志说明',
PRIMARY KEY (`Id`)
)
-- 创建触发器,作用:当在bookinfo中插入一条数记录时,会在logs中生成一条日志信息
DELIMITER ||
CREATE TRIGGER user_log AFTER INSERT
ON bookinfo FOR EACH ROW
BEGIN
DECLARE s1 VARCHAR(40) character set utf8;
DECLARE s2 VARCHAR(40) character set gbk;
SET s1 = ' is created';
#函数CONCAT将字符串连接 NEW.columnname:新增行的某列数据
SET s2 = CONCAT(NEW.book_name,s1);
INSERT INTO logs(log) values(s2);
END
||
DELIMITER ;
-- 查看创建的触发器
SELECT * FROM information_schema.triggers;
-- 测试触发器
select * from logs;
insert into bookinfo(book_name,price,public_date,store) values('解忧杂货店',48,'2016-03-03',48);
select * from logs;
三、运行结果
1>触发器创建成功:
2>触发器执行成功: