zoukankan      html  css  js  c++  java
  • 视图,触发器

    一、视图

    视图是一个虚拟表(非真实存在),其本质是根据SQL语句获取动态的数据集,并为其命名,

    使用视图我们可以把查询过程中的临时表摘出来,用视图去实现,这样以后再想操作该临时表的数据时就无需重写复杂的sql了,直接去视图中查找即可,但视图有明显地效率问题,并且视图是存放在数据库中的,如果我们程序中使用的sql过分依赖数据库中的视图,即强耦合,那就意味着扩展sql极为不便,因此并不推荐使用。

    #两张有关系的表
    mysql> select * from course;
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 生物   |          1 |
    |   2 | 物理   |          2 |
    |   3 | 体育   |          3 |
    |   4 | 美术   |          2 |
    +-----+--------+------------+
    4 rows in set (0.00 sec)
    mysql> select * from teacher;
    +-----+-----------------+
    | tid | tname           |
    +-----+-----------------+
    |   1 | 张磊老师        |
    |   2 | 李平老师        |
    |   3 | 刘海燕老师      |
    |   4 | 朱云海老师      |
    |   5 | 李杰老师        |
    +-----+-----------------+
    5 rows in set (0.00 sec)
    #查询李平老师教授的课程名
    mysql> select cname from course inner teacher on teacher_id = tid where tname = ‘李平’;
    创建视图
    #语法:CREATE VIEW 视图名称 AS  SQL语句
    create view teacher_view as select tid from teacher where tname='李平老师';

    修改视图

    语法:ALTER VIEW 视图名称 AS SQL语句
    mysql> alter view teacher_view as select * from course where cid>3;
    Query OK, 0 rows affected (0.04 sec)
    
    mysql> select * from teacher_view;
    +-----+-------+------------+
    | cid | cname | teacher_id |
    +-----+-------+------------+
    |   4 | xxx   |          2 |
    |   5 | yyy   |          2 |
    +-----+-------+------------+
    2 rows in set (0.00 sec)
    #修改视图,原始表也跟着改
    mysql> select * from course;
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 生物   |          1 |
    |   2 | 物理   |          2 |
    |   3 | 体育   |          3 |
    |   4 | 美术   |          2 |
    +-----+--------+------------+
    4 rows in set (0.00 sec)
    
    mysql> create view course_view as select * from course; #创建表course的视图
    Query OK, 0 rows affected (0.52 sec)
    
    mysql> select * from course_view;
    +-----+--------+------------+
    | cid | cname  | teacher_id |
    +-----+--------+------------+
    |   1 | 生物   |          1 |
    |   2 | 物理   |          2 |
    |   3 | 体育   |          3 |
    |   4 | 美术   |          2 |
    +-----+--------+------------+
    4 rows in set (0.00 sec)

    删除视图
    语法:DROP VIEW 视图名称
    
    DROP VIEW teacher_view

    二、触发器
    使用触发器可以定制用户对表进行【增、删、改】操作时前后的行为,注意:没有查询
    增:
    1 create trigger tri_before_insert_t1 before insert on t1 for each row
    2 begin
    3     sql语句;
    4 end
    1 create trigger tri_after_insert_t1 after insert on t1 for each row
    2 begin
    3     sql语句;
    4 end

    删:

     1 # 删除=》delete
     2 create trigger tri_before_delete_t1 before delete on t1 for each row
     3 begin
     4     sql语句;
     5 end
     6 
     7 create trigger tri_after_delete_t1 after delete on t1 for each row
     8 begin
     9     sql语句;
    10 end

    改:

     1 # 更新前
     2 CREATE TRIGGER tri_before_update_tb1 BEFORE UPDATE ON tb1 FOR EACH ROW
     3 BEGIN
     4     ...
     5 END
     6 
     7 # 更新后
     8 CREATE TRIGGER tri_after_update_tb1 AFTER UPDATE ON tb1 FOR EACH ROW
     9 BEGIN
    10     ...
    11 END

    1、创建触发器:

     1 #准备表
     2 CREATE TABLE cmd (
     3     id INT PRIMARY KEY auto_increment,
     4     USER CHAR (32),
     5     priv CHAR (10),
     6     cmd CHAR (64),
     7     sub_time datetime, #提交时间
     8     success enum ('yes', 'no') #0代表执行失败
     9 );
    10 
    11 CREATE TABLE errlog (
    12     id INT PRIMARY KEY auto_increment,
    13     err_cmd CHAR (64),
    14     err_time datetime
    15 );
    16 
    17 #创建触发器
    18 delimiter //
    19 CREATE TRIGGER tri_after_insert_cmd AFTER INSERT ON cmd FOR EACH ROW
    20 BEGIN
    21     IF NEW.success = 'no' THEN #等值判断只有一个等号
    22             INSERT INTO errlog(err_cmd, err_time) VALUES(NEW.cmd, NEW.sub_time) ; #必须加分号
    23       END IF ; #必须加分号
    24 END//
    25 delimiter ;
    26 
    27 
    28 #往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
    29 INSERT INTO cmd (
    30     USER,
    31     priv,
    32     cmd,
    33     sub_time,
    34     success
    35 )
    36 VALUES
    37     ('egon','0755','ls -l /etc',NOW(),'yes'),
    38     ('egon','0755','cat /etc/passwd',NOW(),'no'),
    39     ('egon','0755','useradd xxx',NOW(),'no'),
    40     ('egon','0755','ps aux',NOW(),'yes');
    41 
    42 
    43 #查询错误日志,发现有两条
    44 mysql> select * from errlog;
    45 +----+-----------------+---------------------+
    46 | id | err_cmd         | err_time            |
    47 +----+-----------------+---------------------+
    48 |  1 | cat /etc/passwd | 2017-09-14 22:18:48 |
    49 |  2 | useradd xxx     | 2017-09-14 22:18:48 |
    50 +----+-----------------+---------------------+
    51 2 rows in set (0.00 sec)

    2、使用触发器

    触发器无法由用户直接调用,而知由于对表的【增/删/改】操作被动引发的。

    3、删除触发器

    drop trigger tri_after_insert_cmd;
     


    每天逼着自己写点东西,终有一天会为自己的变化感动的。这是一个潜移默化的过程,每天坚持编编故事,自己不知不觉就会拥有故事人物的特质的。 Explicit is better than implicit.(清楚优于含糊)
  • 相关阅读:
    LeetCode Merge Two Sorted Lists 归并排序
    LeetCode Add Binary 两个二进制数相加
    LeetCode Climbing Stairs 爬楼梯
    034 Search for a Range 搜索范围
    033 Search in Rotated Sorted Array 搜索旋转排序数组
    032 Longest Valid Parentheses 最长有效括号
    031 Next Permutation 下一个排列
    030 Substring with Concatenation of All Words 与所有单词相关联的字串
    029 Divide Two Integers 两数相除
    028 Implement strStr() 实现 strStr()
  • 原文地址:https://www.cnblogs.com/kylin5201314/p/13639385.html
Copyright © 2011-2022 走看看