mysql视图及触发器

mysql视图及触发器

视图

数据库中的视图是一个虚拟表。同真实表一样,视图包含一系列带有名称的列和列数据。 行和列数据来自由定义视图查询所引用的表, 并且在引用视图时动态生成。

视图是一个虚拟表, 是从数据库中一个或多个表中导出来的, 视图还可以从已经存在的视图的基础上定义。

视图一经定义便存储在数据库中, 但从视图中看到的数据并没有在数据库中再存储一份, 通过视图看到的数据实际存放在基本表中。 对视图进行修改操作, 相应的基础表的数据也会跟着变化; 同时,基本表的数据变化, 视图中相应的数据也会编变化。

视图作用:
- 简单化: 将经常使用的查询定义为视图, 从而使用户不必为有的操作每次指定全部的条件。
- 安全性: 通过视图用户只能查询和修改他们所能见到的数据。 数据库授权命令是每个用户对数据库的检索限制到特定的数据库对象上, 但不能授权到数据库特定的列和特定的行上, 而通过视图可以实现。
- 逻辑数据独立性: 视图可以帮助用户屏蔽真实表结构变化带来的影响。

1. 创建视图

视图中包含select查询的结果, 因此视图的创建基于select语句和已经存在的数据表。

创建视图语法:

create[or replace] [algorithm = {undefined | merge | temptable}]
    view view_name [(column_list)]
    as select_statement
    [with [cascaded | local] check option]
  • create 表示创建新的视图, replace表示替换已经创建的视图;
  • algorithm 表示视图选择的算法, 可以有三个取值; 分别是 undefined | merge | temptable, undefined表示mysql将自动选择算法; merge 表示将使用的视图语句与视图定义合并, 使得视图定义的某一部分取代语句对应的部分; temptable表示将视图的结果存入临时表, 然后用临时表来执行语句。
  • view_name 视图名称, column_list为属性列, select_statement 表示select语句
  • cascaded 与 local 为可选参数, cascaded为默认值, 表示更新视图是要满足所有相关视图和表的条件; local表示更新视图是满足该视图本身定义的条件即可。

注意:
- 该语句要求具有create view权限, 及select对应表的select权限, 若还有 or replace字句, 还需要有视图的drop权限。
- 视图属于数据库, 默认在当前数据库下创建新的视图, 给指定的数据库创建视图, 在创建时将名称指定为: db_name:view_name

2. 查看视图

查看视图是指查看数据库中已存在的视图的定义。查看视图有三种方式: describe, show table status, show create view

-- view_name 表示视图名称
describe view_name;  -- 方式一
show table status like 'view_name'; -- 方式二
show create view view_name; -- 方式三

information_schema数据库的views表存储了所有视图的定义, 可以通过查询views表查询出视图;

select * from information_schema.views; -- 查询出所有的视图

查看视图中的数据
与查看数据库表一样

select * from view_name;

3. 修改视图

修改视图是指修改数据库中存在的视图, 当表中某些字段发生变化是, 可以通过修改视图来保持与基本表的一致性.有两种方式:
- 方式一: 通过 create or replace, 若视图存在, 则修改; 若视图不存在, 则创建.

create or replace [algorithm = {undefined | merge | temptable}]
    view view_name [(column_list)]
    as select_statement
    [with [cascaded | local] check option]
  • 方式二: 使用 alter 语句, 只是把 create or replace 换成了 alter, 其他和方式一一样.
alter [algorithm = {undefined | merge | temptable}]
    view view_name [(column_list)]
    as select_statement
    [with [cascaded | local] check option]

4. 更新视图

更新视图是指通过视图来插入, 更新, 删除表中的视图, 因为视图是一个虚拟表, 其中没有数据. 语法和更新数据库表类似; 例如:

update view_t set price = 5;
insert into view_t values(3, 5);
delete from view_t where price = 5;

5. 删除视图

删除一个或者多个视图

drop view [if exists]
    view_name [, view_name]...
    [restrict | cascaded]

MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用

6. 创建视图demo

学生表与课程表信息。

  1. 创建表:
-- 学生表
CREATE TABLE student (
    stuId INT,
    NAME VARCHAR (10),
    PRIMARY KEY (stuId)
);
-- 课程表
CREATE TABLE course (
    id INT,
    course_name VARCHAR (10),
    PRIMARY KEY (id)
);
-- 学生与课程关系表, 多对多
CREATE TABLE stu_course (
    stuId INT,
    courId INT,
    credit INT,
    PRIMARY KEY (stuId, courId),
    FOREIGN KEY (stuId) REFERENCES student (stuId),
    FOREIGN KEY (courId) REFERENCES course (id)
);
  1. 创建视图: 视图中包含: stuId, stu_name, course_name, credit; 视图字段分别为: 学生主键, 学生名字, 学生选的课程名,该学生这门课程成绩
CREATE VIEW stuAllCourseCredit (
    stuId,
    stu_name,
    course_name,
    credit
) AS SELECT
    s.stuId,
    s. NAME,
    c.course_name,
    sc.credit
FROM
    student s,
    course c,
    stu_course sc
WHERE s.stuId = sc.stuId and c.id=sc.courId;

7. 注意点

1. mysql 中视图和表的区别:
- 视图是已经编译好的sql语句, 是基于sql语句的结果集的可视化的表, 而表不是;
- 视图没有实际的物理记录, 而基本表有;
- 表示内容, 视图是窗口;
- 表占用物理空间而视图不占用物理空间, 视图只是逻辑概念存在, 表可以及时对他进行修改, 但视图只能用创建的语句来修改;
- 视图是查看数据表的一种方法, 可以查询数据表中某些字段构成的数据, 只是一些sql语句的集合. 从安全的角度来说, 视图可以防止用户接触数据库,因而用户不知道表结构;
- 表属于全局模式中的表, 是实表; 视图属于局部模式的表, 是虚表;
- 视图的建立和删除只影响视图本身, 不影响对应的基本表;

2. 两者的联系:
视图是基于基本表建立, 它的结构(即所定义的列) 和内容(即所有记录)都是来自基本表, 视图依赖于基本表的存在而存在. 视图是基本表的抽象和逻辑意义上建立的新关系;

触发器

触发器是由事件来来触发某个操作, 这些事件包括insert, update 和 delete语句。如果定义了触发程序, 当数据库执行这些语句的时候就会激发触发器执行相应的操作. 触发程序是与表有关的命名数据库对象.

1. 创建触发器

create trigger trigger_name trigger_time trigger_event 
    on ta1_name for each row trigger_stmt

trigger_name 表示触发器的名字, trigger_time 标识触发时机, 可以指定为before或after; trigger_event 标识触发事件, 包括insert、 update 和 delete; tb1_name 建立触发器的表名, 即在那张表上建立触发器; trigger_stmt 是触发器的程序体, 触发器程序可以使用begin和end作为开始结束, 中间包含多条语句. 例如:

create table account(num int, name varchar(10), password varchar(10));  -- 创建测试表account

-- 创建只有一个执行语句的触发器
set @num = 0; -- 用户自定义变量, 设置初始值为0
create trigger ins_sum before insert on account
    for each row set @sum = @sum + new.num;

-- 创建有多个执行语句的触发器, 该触发器逻辑, 当account出现insert操作时, 在insert之前检查num字段是否为null, 若为null, 则将num值置为10;
create trigger ins_name before insert on account
    for each row begin
    if new.num is null then
        set new.num=10;
    end if;
    end;

insert into account(name) VALUES ('hello'); -- 插入一条数据, num为null
mysql> select * from account;  -- 查看表中记录, num被置为10;
+------+-------+----------+
| num  | name  | password |
+------+-------+----------+
|   10 | hello | NULL     |
+------+-------+----------+

2. 查看触发器

查看触发器定义, 状态及语法信息等. 可以通过show triggers 或者从triggers表中查看.

show triggers; -- 查看当前创建的所有触发器信息。

select * from information_schema.triggers where condition;
-- 例如, 查看之前创建的触发器ins_name: select * from information_schema.triggers where trigger_name='ins_name';

3. 删除触发器

drop trigger [scheme_name.]trigger_name;

-- 例如: drop trigger ins_name;

scheme_name 数据库名字, 若不指定默认删除当前数据库下的trigger_name;

4. 注意点

  1. 使用触发器注意点
    对于相同的表, 相同的事件只能创建一个触发器, 比如对表的account创建了一个before insert 触发器, 那么如果对表account再次创建一个before insert触发器, mysql会报错, 此时只能创建其他事件的触发器;

  2. 及时删除不需要的触发器
    触发器定义后, 每次执行触发事件, 都会激活触发器并执行触发器中的语句. 需求发生变化,应及时修改删除不需要的触发器, 否则触发器仍会执行旧的语句, 从而影响新的数据的完整性.

本笔记内容参考《mysql5.6从零开始学》一书,仅作为学习笔记

你可能感兴趣的:(mysql)