7 视图、触发器
一、视图(view):
1 什么是视图
视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接使用
其实视图也是表
2 为什么要用视图
如果要频繁的操作一张虚拟表(拼表组成的),你就可以制作成视图 后续直接操作
3 如何操作
# 固定语法
create view 表名 as 虚拟表的查询sql语句
# 具体操作
create view teacher2course as
select * from teacher INNER JOIN course
on teacher.tid = course.teacher_id
;
drop view teacher2course;
# 视图使用频率不高
4 注意
- 创建视图在硬盘上只会有表结构 没有表数据(数据还是来自于之前的表)
- 视图一般只用来查询 里面的数据不要继续修改 可能会影响真正的表
-
视图到底使用频率高不高呢?
- 不高
- 当你创建了很多视图之后 会造成表的不好维护
二、触发器
(满足特定条件之后自动执行) -
在满足对表数据进行增、删、改的情况下,自动触发的功能
使用触发器可以帮助我们实现监控、日志...
触发器可以在六种情况下自动触发 增前 增后 删前删后 改前改后
1 基本语法结构
create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
begin
sql语句
end
2 具体使用 针对触发器的名字 我们通常需要做到见名知意
触发器名字在命名的时候推荐使用下列的方式
tri_after_insert_t1、tri_before_delete_t1
针对增
# 增前
create trigger tri_before_insert_t1 before insert on t1
for each row
begin
sql语句
end
# 增后
create trigger tri_after_insert_t1 after insert on t1
for each row
begin
sql语句
end
"""针对删除和修改 书写格式一致"""
# 如何临时修改SQL语句的结束符
delimiter $$
# 在MySQL中NEW特指数据对象可以通过点的方式获取字段对应的数据
id name pwd hobby
1 jason 123 read
NEW.name >>> jason
ps:
修改MySQL默认的语句结束符 只作用于当前窗口
delimiter $$ 将默认的结束符号由;改为$$
delimiter ;
3.案例
CREATE TABLE cmd (
id INT PRIMARY KEY auto_increment,
USER CHAR (32),
priv CHAR (10),
cmd CHAR (64),
sub_time datetime, #提交时间
success enum ('yes', 'no') #0代表执行失败
);
CREATE TABLE errlog (
id INT PRIMARY KEY auto_increment,
err_cmd CHAR (64),
err_time datetime
);
delimiter $$ # 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
if NEW.success = 'no' then # 新记录都会被MySQL封装成NEW对象
insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
end if;
end $$
delimiter ; # 结束之后记得再改回来,不然后面结束符就都是$$了
当cmd表中的记录succes字段是no那么就触发触发器的执行去errlog表中插入数据
NEW指代的就是一条条数据对象
#往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
INSERT INTO cmd (
USER,
priv,
cmd,
sub_time,
success
)
VALUES
('tony','0755','ls -l /etc',NOW(),'yes'),
('tony','0755','cat /etc/passwd',NOW(),'no'),
('tony','0755','useradd xxx',NOW(),'no'),
('tony','0755','ps aux',NOW(),'yes');
表中sussess字段是no那么就触发触发器的执行去errlog表中插入数据
# 查询errlog表记录
select * from errlog;
# 查看触发器
show triggers;
# 删除触发器
drop trigger tri_after_insert_cmd;
面向对象
import json import datetime class MyJSONClass(json.JSONEncoder): def default(self, o): if isinstance(o, datetime.date): print(type(o)) return str(o) return super().default(o) func_dict = {'time': datetime.date.today()} res = json.dumps(func_dict, cls=MyJSONClass) # 序列化 print(res) # 1.先手动转字符串 之后再序列化 # func_dict = {'time': str(datetime.date.today())} # res = json.dumps(func_dict) # 序列化 # print(res)