视图,触发器

一、视图

视图是一个虚拟表(非真实存在),其本质是根据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.(清楚优于含糊)
原文地址:https://www.cnblogs.com/kylin5201314/p/13639385.html