(六)、存储函数 (Function)
1.存储函数
(1).存储函数_介绍
存储函数是由返回值的存储过程,存储函数的参数只能是IN类型的。
(2).存储函数_语法
create function 存储函数名称 ([参数列表]) returns type [可选参数特性...] begin -- SQL语句; return ...; end; 可选参数特性characteristic说明: mysql8.0+必须要写 1. determinstic: 相同的输入参数总是产生相同的结果 2. not sql : 不包含sql语句 3. reads sql data: 包含读取数据的语句,但不包含写入数据的语句。
(3).存储函数_示列
计算从1累加到n的值,n为传入的参数值。
#默认为in且只能为in create function fun_1(n int) returns int begin declare total int default 0; WHILE n>0 DO set total := total+1; set n := n-1; END WHILE; return total; end; select fun_1(10);
(七)、触发器 (Trigger )
1.触发器_介绍
触发器是与表有关的数据库对象,指在insert/update/delete
之前或者之后,触发并执行触发器中定义的SQL语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作。
使用别名 OLD
和 NEW
来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在 触发器还只是支持行级触发,不支持语句级触发。
行级触发器: 假如执行一条SQL语句,这一条SQL影响了N行,这个触发器会执行N次。
语句级触发器: 假如执行一条SQL语句,这一条影响了N行,这个触发器只会执行1次。
触发器类型 | new 和 old |
insert 型触发器 | new 表示将要或者已经新增的数据 |
update 型触发器 | old 表示要修改之前的数据,new 表示将要或已经修改后的数据 |
delete 型触发器 | old 表示将要或者已经删除的数据 |
2.触发器_语法
1.创建触发器
create trigger 触发器名字 [before/after] [什么型触发器] on 表名 for each row --行级触发器 begin 触发器语法; end;
2.查看触发器
show triggers;
3.删除触发器
drop trigger [指定数据库名] 触发器名; --如果没有指定触发器,默认当前数据库。
3.触发器_案列 (insert 类型)
通过触发器记录 tb_user 表的数据变更日志,将变更日志插入到日志表 user_logs中,包含增加、修改、删除;
一定要注意日志表的编码要和绑定的表的编码一致。否则报错Incorrect string value: '\xBD\xAA\xD7\xD3\xD1\xC0...' for column 'operate_pa
create table user_logs( id int(11) not null auto_increment, operation varchar(20) not null comment '操作类型, insert/update/delete', operate_time datetime not null comment '操作时间', operate_id int(11) not null comment '操作的ID', operate_params varchar(500) comment '操作参数', primary key(`id`) )engine=innodb default charset=gbk;
-- 在主键自增的SQL表中,如果我们没有在表后面跟着所有的字段,那么我们需要给主键自增赋值为null。 如果在表后面跟了其他字段但没有主键字段,那么就不用写(默认为null)。 -- 1.插入触发器的语法 create trigger tb_user_insert_trigger -- 给tb_user2表行锁 after insert on tb_user2 for each row begin -- 利用new来获取我们新插入的数据 insert into user_logs values(null,'insert',now(),new.id,concat('插入的数据内容为: id=',new.id,'name=',new.name,'phone=',new.phone,'email=',new.email,'profession=',new.profession)); end; --2.查询 show triggers; -- 3.插入数据 (这里主键id的字段没写,所以不用添加null给主键,主键默认赋值为null) INSERT INTO tb_user2 (name, phone, email, profession, age, gender, status,createtime) VALUES ('姜子牙4', '17799990023', '11111111@qq.com', '土木工程', 29,'1', '4', now());
4.触发器_案列 (update 类型)
-- 2.修改触发器 create trigger tb_user_update_trigger after update on tb_user2 for each row begin insert into user_logs values(null,'update',now(),new.id,concat( 'UpdateBefor: id=',new.id,'name=',new.name,'phone=',new.phone,'email=',new.email,'profession=',new.profession, 'updateAfter: id=',old.id,'name=',old.name,'phone=',old.phone,'email=',old.email,'profession=',old.profession )); end; update tb_user2 set age='11' where id=20;
5.触发器_案列(delete 类型)
create trigger tb_user_delete_trigger after delete on tb_user2 for each row begin insert into user_logs values(null,'delete',now(),old.id,concat( 'delete: id=',old.id,'name=',old.name,'phone=',old.phone,'email=',old.email,'profession=',old.profession )); end; show triggers; delete from tb_user2 where id = 21;