数据库的一些概念

淺唱寂寞╮ 提交于 2019-11-28 07:57:13

视图

  什么是视图

  视图是一张虚拟表,比如内连接产生的虚拟表
  保存下来,下次可以直接使用,而不是下次再重复写一下内连接​​​

  为什么要用视图

  如果要频繁使用一张虚拟表,使用视图就不用重复查询

  如何使用视图

  关键字view 和as
  ​create view teacher2course as
  select * from teacher inner join course on teacher_id = teacher.tid​

  强调

  1. 在硬盘中,视图只有表结构文件,没有表数据文件
  2. 视图通常适用于查询,尽量不要修改视图中的数据
  3. 一般情况下不会频繁使用视图:
  开发过程中如果项目中大量使用到了视图,
  ​那意味着后期想扩张某个功能的时候,恰巧有需要对视图进行修改​​​;
  也就意味着需要先在驶入修改,再去SQL语句修改;​
  也就意味着涉及跨部门沟通。
  所以通常不会使用视图,而是通过重新修改SQL语句来扩展功能​​

触发器

  什么是触发器

  达到某种条件,自动触发的功能
  例如对某张表的增删改时,自动触发SQL代码执行​

  触发器语法

    固定语法结构
            create trigger 触发器的名字 
​            after/before insert/update/delete 
            ​on 表名 for each row
            begin
                sql语句
            end

  触发器语法案例

  
# 针对插入
create trigger tri_after_insert_t1 after insert on 表名 for each row
begin
    sql代码。。。
end 
create trigger tri_after_insert_t2 before insert on 表名 for each row
begin
    sql代码。。。
end
​
# 针对删除
create trigger tri_after_delete_t1 after delete on 表名 for each row
begin
    sql代码。。。
end
create trigger tri_after_delete_t2 before delete on 表名 for each row
begin
    sql代码。。。
end
# 针对修改
create trigger tri_after_update_t1 after update on 表名 for each row
begin
    sql代码。。。
end
create trigger tri_after_update_t2 before update on 表名 for each row
begin
    sql代码。。。
end
​
# 案例
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
    ('egon','0755','ls -l /etc',NOW(),'yes'),
    ('egon','0755','cat /etc/passwd',NOW(),'no'),
    ('egon','0755','useradd xxx',NOW(),'no'),
    ('egon','0755','ps aux',NOW(),'yes');
​
# 查询errlog表记录
select * from errlog;
# 删除触发器
drop trigger tri_after_insert_cmd;
View Code

事务​

  

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!