Mysql之视图和触发器
定义:
1.视图是一种虚拟的表,是从数据库中一个或者多个表中导出来的表。
2.数据库中只存放了视图的定义,而并没有存放视图中的数据,这些数据存放在原来的表中。
3.使用视图查询数据时,数据库系统会从原来的表中取出对应的数据
作用:
1.使操作简便化;
2.增加数据的安全性;
3.提高表的逻辑独立性;
创建视图
CREATE [ALGORITHM ={ UNDEFIEND | MERGE | TEMPTABLE }]
VIEW 视图名 [ ( 属性清单) ]
AS SELECT 语句
[ WITH [ CASCADED | LOCAL ] CHECK OPTION ];
ALGORITHM 是可选参数,表示视图选择的算法;
“视图名”参数表示要创建的视图的名称;
“属性清单”是可选参数,其指定了视图中各种属性的名词,默认情况下与 SELECT 语句中查询的属性相同;
SELECT 语句参数是一个完整的查询语句,标识从某个表查出某些满足条件的记录,将这些记录导入视图中;
WITH CHECK OPTION 是可选参数,表似乎更新视图时要保证在该视图的权限范围之内;
ALGORITHM 包括 3 个选项 UNDEFINED、MERGE 和 TEMPTABLE。其中,UNDEFINED 选项表示 MySQL 将
自动选择所要使用的算法;MERGE 选项表示将使用视图的语句与视图定义合并起来,使得视图定义的某一部分
取代语句的对应部分;TEMPTABLE 选项表示将视图的结果存入临时表,然后使用临时表执行语句;CASCADED
是可选参数,表示更新视图时要满足所有相关视图和表的条件,该参数为默认值;LOCAL 表示更新视图时,要
满足该视图本身的定义条件即可;
在之前的表种建立视图
CREATE VIEW v1 AS SELECT * FROM book;
CREATE VIEW v2 AS SELECT bookName,price FROM book;
SELECT * FROM v1;
SELECT * FROM v2;
CREATE VIEW v4 AS SELECT bookName,bookTypeName FROM book,booktype WHERE book.bookTypeId=booktype.id;
CREATE VIEW v5 AS SELECT tb.bookName,tby.bookTypeName FROM book tb,booktype tby WHERE tb.bookTypeId=tby.id;
SELECT * FROM v4;
SELECT * FROM v5;
查看视图DESCRIBE 语句查看视图基本信息
DESC v5;
SHOW TABLE STATUS 语句查看视图基本信息
SHOW TABLE STATUS LIKE 'v5';
SHOW TABLE STATUS LIKE 'book';
SHOW CREATE VIEW 语句查看视图详细信息
SHOW CREATE VIEW v5;
在 views 表中查看视图详细信息
修改,删除视图中数据
SELECT * FROM v1;
CREATE OR REPLACE VIEW v1(bookName,price) AS SELECT bookName,price FROM book;
ALTER VIEW v1 AS SELECT * FROM book;
SELECT * FROM v1;
INSERT INTO v1 VALUES(NULL,'java ',120,'里斯',1); --本质上还是修改基础表的数据
UPDATE v1 SET bookName='java very good',price=200 WHERE id=5;
DELETE FROM v1 WHERE id=5;
删除视图
DROP VIEW IF EXISTS v4;
触发器
定义
触发器(TRIGGER)是由事件来触发某个操作。这些事件包括 INSERT 语句、UPDATE 语句和 DELETE 语句。
当数据库系统执行这些事件时,就会**触发器执行相应的操作。
创建只有一个执行语句的触发器
在之前的bookType表种添加字段bookNum代表此此类型书籍的数量
CREATE TRIGGER 触发器名 BEFORE |AFTER 触发事件
ON 表名 FOR EACH ROW 执行语句
CREATE TRIGGER trig_book AFTER INSERT
ON book FOR EACH ROW
UPDATE bookType SET bookNum=bookNum+1 WHERE new.bookTypeId=booktype.id;--new代表新增的数据
此时bookType中数据为
执行触发语句,给book新增一条数据
INSERT INTO book VALUES(NULL,'java好',100,'ke',1);
此时bookType中计算机类的bookNum为5
创建有多个执行语句的触发器
创建日志记录表book_logs
CREATE TABLE book_logs (
id int(10) NOT NULL AUTO_INCREMENT,
exexctiob_time datetime DEFAULT NULL,
desc varchar(30) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建触发器
CREATE TRIGGER 触发器名 BEFORE |AFTER 触发事件
ON 表名 FOR EACH ROW
BEGIN
执行语句列表
END
DELIMITER |
CREATE TRIGGER trig_book2 AFTER DELETE
ON book FOR EACH ROW
BEGIN
UPDATE bookType SET bookNum=bookNum-1 WHERE old.bookTypeId=booktype.id;
INSERT INTO book_logs VALUES(NULL,NOW(),'在book表里删除了一条数据');
END
|
DELIMITER ;
DELEMITER详细解释:
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。默认情况下,delimiter是分号;mysql一遇到分号,它就要自动执行,所以我们使用|作分隔符
执行触发语句,删除book数据id为5的信息
DELETE FROM book WHERE id=5;
SHOW TRIGGERS 语句查看触发器信息
SHOW TRIGGERS ;
删除触发器
DROP TRIGGER trig_book2 ;
总结:我经历的项目中视图和触发器用的不多,自己更是没有写过,在刚开始学java的时候有学过oracle的这些,但因为实际当中没使用过,便都忘了,再次学习是为了记忆,今天看了这个发现其实很有用处,例如在业务场景比较复杂的时候就可以使用触发器来提高代码响应时间。