mysql之视图、触发器、事务等
视图view(了解)
# 什么是视图
将SQL语句的查询结果当做虚拟表实体化保存起来,可以多次使用
建议不要建立太多的视图表(命令行中不容易区分),视图表中的数据来自于原表,无法对视图表中的数据进行修改
create view 表名 as sql语句
create view teacher2course as
select * from teacher inner join course on teacher.tid = course.teacher_id;
# 删除视图表
drop view teacher2course;
# 视图使用频率不高
触发器trigger
# 触发器:满足特定条件后自动触发
关键字:trigger
在MySQL只有三种情况下可以触发
# before/after insert/update/delete
1.针对表的增
增前 增后
2.针对表的改
改前 改后
3.针对表的删
删前 删后
# 语法结构
create trigger 触发器名称 before/after insert/update/delete on 表名 for each row
begin
sql语句
end
# 触发器名字在命名是建议使用一下方式(见名知意)
tri_after_insert_t1、tri_before_delete_t1
# 如何修改SQL语句的结束符(结束符与分割符冲突)
delimiter $$
# 在MySQL中NEW特指数据对象可以通过点的方式获取字段对应的数据
id name pwd hobby
1 jason 123 read
NEW.name >>> jason
# 案例
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中插入记录,触发触发器,根据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'),