Mysql视图和触发器

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Mysql视图和触发器

视图

  • 视图是什么, 是否真实存在?

人理解:视图视图,只是你可以看见的一层抽象层, 它并不真实存在, 而是在真实存在的一张或者多张表之上的一层封装, 对于select查询语句的提前封装. 不涉及数据的存储.


这样的一层封装好处是蛮多的. 对于复杂查询操作语句的简化  --- 方便后序使用.


安全性, 我们在使用视图 时,一般不会轻易通过视图对底层数据进行修改. 而且可以可以通过权限限制, 已得到更高的安全性.  


官方定义:


视图(view)是一种虚拟存在的表,是一个逻辑表(不涉及实际的存储),本身并不包含数据。其内容由查询定义。


基表:用来创建视图的表叫做基表;


通过视图,可以展现基表的部分数据;


视图数据来自定义视图的查询中使用的表,使用视图动态生成;

注意:   视图的修改可以映射到基表, 也就是说, 视图可以做到修改基表.  


这个很多时候容易想不明白. 视图只是一张虚拟表, 通过基表生成, 为什么我们还允许这张虚拟表数据的更改足以映射到基表?


针对单表映射而成的视图而言,  视图的修改可以映射到基表.  


同样, 基表数据的更改也会影响到视图. 毕竟对视图的各种操作也是映射到基表上面去的


其一,视图并不保存数据,  如果视图修改的数据并不能映射到基表, 那么修改的这个数据就无法存储下来.


其二,个人一个理解, 视图有些时候是更高层级的人维护, 创建出来给开发人员使用的, 开发人员的操作应该需要能映射到基表中. 为啥开发人员都只是看视图,而不是原表?  有些数据可能需要保密. 开发人员也只能查看部分.


测试: 视图和基表是否可以相互影响.  

视图的修改可以映射到基表, 验证如下.

验证基表的修改是否会映射到视图 (也会)

  • 如何创建视图?

create view view_name as (select 语句)

select语句可以是嵌套查询, 也可以是联表查询
创建之后相当于是如下:

删除视图

drop view view_name;

查看视图。 没有单独查看视图的命令, 直接查看表就会看到视图. 所以对于视图我们的命名还是可以给与区分一下

  • 视图的用途?

可复用,减少重复语句书写;类似程序中函数的作用。 比如联表查询语句. 组合成视图之后,简化了不要太多.

逻辑更清晰,屏蔽查询细节,关注数据返回;


注意点

视图不能添加索引,也不能有关联的触发器或者默认值


抓住视图并没有存储数据, 对视图的操作就是映射到对基表的操作, 视图可以简单理解为基表的一个简化对外显示。视图操作映射到基表, 基表操作也同样会影响视图. (关键就在于视图没有单独存储数据)


还有另外一种视图, 叫做物化视图, 这种视图和普通视图不太一样的是. 物化视图是存储数据的, 而且物化视图数据的访问不是从基表, 而是直接从物化视图中读取数据的


物化视图(Materialized Views,以下简称 MV)是一种特殊的视图,它的数据会持久化。那么在查询 MV 时,并不会去访问基表,而是直接从 MV 里读数据。(可做了解)

触发器

个人理解: 触发器就是一个条件触发,  事件触发.   和自动机, 状态机有点相似.


有限自动机: 提前制定好条件, 以及条件满足时候的执行操作. 后面满足条件就会循环不断的自动执行相应的操作. 这个就是自动机了.  (其实本质也是一种条件触发)    同样触发器也是. 就像是回调机制, 同步操作.


触发器就是指定在特定的sql DML操作发生之时在操作之前或者之后的瞬间接近同步的执行触发器指定的触发操作.


官方定义:9


触发器(trigger)是MySQL提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表 事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比 如当对一个表进行DML操作( insert , delete , update )时就会激活它执行。


触发器关注要素:


监控的对象: table表

监控的事件类型: insert update delete

触发时机:before   after

指定触发事件: insert update delete

  • 怎么创建触发器?
create trigger trigger_name                
trigger_time monitor_trigger_event        -- 触发时机, 监控事件
on table_name for each row                -- 监控表
begin
     trigger_body;                        -- 正文, 触发事件
end

NEW && OLD (数据插入后的新表 删除后的旧表, 更新前后的新旧表)

  • insert类型触发器中:  New 用来表达即将(before)或者已经(after)插入的新数据;
  • delete类型触发器中:Old用来表达将要或者已经删除的旧的数据.
  • update类型触发器中: old表示原来的旧的数据, new表示新的更新的数据

用法:

new.colname  (新的数据的某一字段)

old.colname   (旧的原来的数据的某一字段)

  • 触发器用途 (应用场景)?

先准备两个表: 订单表和货物表

CREATE TABLE `order` (
  `id` INT PRIMARY KEY auto_increment,    -- 主键字段
  `goods_id` INT,                         -- 货物id, 外键字段
  `quantity` SMALLINT COMMENT '下单数量'   -- 下单数量
);
CREATE TABLE `goods` (
  `id` INT PRIMARY KEY auto_increment,   -- goods_id 货物主键字段
  `name` VARCHAR (32),                   -- 货物名称
  `num` SMALLINT DEFAULT 0               -- 货物数量
);

要求1:

每当客户购买, 下单的时候,就自动跟新一下货物库存.  (客户下单, 触发货物库存更新操作)

-- 创建触发器
create trigger trig_order_4 -- 触发器名称 
after insert -- 触发器时机, 监控触发事件
on `order` for each row
begin
  update goods set num = num - new.quantity where id = new.goods_id; 
    -- 触发正文, 触发事件
end

Test: 测试 (id=1自动减少了2,这个是我之前创建的触发器还没有删除, 不是出错了)

反正就是, 如果是插入,可以通过插入的数据new表进行限定. 如果是删除操作可以用old表对删除数据进行指定, 如果是update操作, 可以用old对更新之前的数据指定和new更新之后的数据进行限定.


正好引入删除触发器 drop trigger trigger_name 删除;

触发器是否具有事务性?


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
19天前
|
存储 安全 关系型数据库
2024 Mysql基础与进阶操作系列之MySQL触发器详解(21)作者——LJS[你个小黑子这都还学不会嘛?你是真爱粉嘛?真是的 ~;以后请别侮辱我家鸽鸽]
MySQL触发器的使用场景之数据完整性约束、如何具体创建person的日志表、触发器与存储过程的对比与选择、触发器的性能和注意事项等具体操作详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
19天前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(8)作者——LJS[含MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;注意点及常见报错问题所对应的解决方法]
MySQL 创建、修改、跟新、重命名、删除视图等具体详步骤;举例说明注意点及常见报错问题所对应的解决方法
|
2月前
|
SQL 存储 关系型数据库
mysql-视图的定义和简单使用
这篇文章介绍了MySQL中视图的定义和简单使用方法,包括视图的创建规则和使用限制。通过一个实际的例子,展示了如何创建视图以及如何使用视图来简化复杂的SQL查询操作。
mysql-视图的定义和简单使用
|
2月前
|
存储 缓存 关系型数据库
MySQL 视图:数据库中的灵活利器
视图是数据库中的虚拟表,由一个或多个表的数据经筛选、聚合等操作生成。它不实际存储数据,而是动态从基础表中获取。视图可简化数据访问、增强安全性、提供数据独立性、实现可重用性并提高性能,是管理数据库数据的有效工具。
|
3月前
|
存储 关系型数据库 MySQL
MySQL 中的触发器数量之谜
【8月更文挑战第31天】
39 0
|
3月前
|
SQL 数据采集 关系型数据库
|
3月前
|
存储 关系型数据库 MySQL
|
9天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
24 1
|
11天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
26 4
|
18天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
85 1

热门文章

最新文章