mysql-视图与触发器

视图

什么是视图

本质上是一个虚拟的表,即看得见但是不实际存在

使用场景:

  • 我们希望某些查询语句只能查看到某个表中的一部分记录,就可以使用视图
  • 简化sql语句的编号

注意:修改视图,也会引起原表的变化,我们不要这么做,视图仅用于查询

# 语法
create or replace view view_name as 查询语句; # view_name 表示创建视图的虚拟表名字       or replace 如果视图已经存在了,就替换里面的查询语句;

# 修改视图
alter view view_name as 新的语句;

# 删除视图
drop view view_name;

# 查看
desc view_name;
show create view view_name;

# 举例子
create table salaryes (id int ,name char(10), money float);
insert into salaryes values (1,"张三丰",50000),(2,"张无忌",40000);

# 创建视图
create view zwj_view as select * from salaryes where name = "张无忌";
select * from zwj_view;
+------+-----------+-------+
| id   | name      | money |
+------+-----------+-------+
|    2 | 张无忌    | 40000 |
+------+-----------+-------+

触发器

触发器: 是一段与某个表相关的sql语句,会在某个时间点,满足某个条件后自动触发执行,其中有两个关键因素:

  • 时间点
    • 可以是事件发生前 before
    • 可以是事件发生后 after
  • 事件
    • update delete insert

再触发器自动的包含两个对象

  • old update , delete 中可以
  • new update , insert 中可用

用来干什么:

​ 可以用于:当表的数据被修改时,自动记录一些数据,执行一些sql语句

# 语法
delimiter |   # 重新定义行结束符,因为begin后面接逻辑代码里有;符号,如果重新定义会报错,原因是遇到分好自动提交了
# t_time = after or before , t_event = insert or update or delete
create trigger t_name t_time t_event on table_name for each row 
begin
添加sql 语句.....
end;
delimiter ; # 执行完毕后,需要把行结束符恢复

# 删除触发器
drop trigger t_name;

# 查看所有触发器
show triggers;

# 查看某个触发器的语句
show create trigger t_name
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 |
# 创建触发器
create trigger cmd_insert after insert on cmd for each row 
begin 
if new.success = "no" then 
    insert into errlog values(null,new.cmd,new.sub_time);
end if;
end |
delimiter ;

# 创建一个触发器 叫cmd_insert  
# 触发器会在 插入数据到cmd表后执行 
# 当插入的记录的success为no时 自动插入记录到errlog中 

insert into cmd values (null,"root","max","rm ",now(),"no");
insert into cmd values (null,"root","max","ls ",now(),"yes");

猜你喜欢

转载自www.cnblogs.com/raynduan/p/11444757.html