首页 > 数据库 >MySQL进阶知识之视图、触发器、事务

MySQL进阶知识之视图、触发器、事务

时间:2024-06-20 20:44:18浏览次数:23  
标签:触发器 进阶 数据库 事务 视图 查询 MySQL 数据

【一】MySQL进阶知识之视图

【1】视图介绍

(1)什么是视图

视图就是通过查询得到一张虚拟表,然后保存下来,下次可以直接使用

视图也是一张表

  • 在计算机科学中,视图(View)是一种虚拟表,其内容是一个或多个基本表的查询结果。

    • 视图基于数据库中的数据,通过定义查询语句来构建,并在需要时动态地计算数据。
    • 与基本表不同,视图不存储实际的数据,而是根据查询语句在使用时进行实时计算。
  • 视图可以用于简化复杂查询、隐藏敏感数据、实现数据安全性和完整性约束等。

    • 通过定义视图,用户可以从一个或多个基本表中选择所需的列和行,以满足特定的查询需求。
    • 用户可以对视图执行与表相同的查询操作,如SELECT、INSERT、UPDATE 和 DELETE。
  • 视图可以是虚拟的,也可以是物化的。

    • 虚拟视图是基于查询结果的定义,每次查询时都会计算最新的结果。
    • 物化视图是基于查询结果的缓存,用于提高查询性能。
    • 虚拟视图适用于经常变动的数据,而物化视图适用于查询频繁但数据变动较少的情况。
  • 总之,视图是一种查询结果的抽象表示,它提供了一种灵活和安全的方式来访问和操作数据库中的数据。

    • 通过使用视图,用户可以根据自己的需求获取所需的数据,而无需直接访问底层的基本表。

(2)为什么要用视图

如果要频繁操作一张虚拟表(拼表组成),就可以制作成视图,后续直接操作

(3)视图的优点

  • 简化复杂查询:

    • 视图可以对基本表进行复杂的操作,包括连接多个表、过滤条件、聚合函数等。
    • 通过定义视图,可以将复杂的查询逻辑封装到一个简单的视图中,使用户能够以更简洁明了的方式进行数据检索。
  • 数据安全性:

    • 视图可以限制用户对数据的访问权限,通常用于隐藏敏感数据或只提供部分数据给特定的用户。
    • 通过定义视图并设置相应的权限,可以保护数据的安全性,防止未经授权的用户访问敏感信息。
  • 数据完整性:

    • 视图可以用于实现数据完整性约束,即对数据的有效性进行验证。
    • 通过定义视图并添加计算列、过滤条件等约束,可以确保所返回的数据满足一定的条件,提高数据的准确性和一致性。
  • 逻辑数据独立性:

    • 视图使得应用程序与数据之间解耦,即应用程序不需要了解底层表结构的细节。
    • 这样,当底层数据库发生变化时(如表结构修改),只需调整底层视图的定义而无需修改应用程序,从而提高系统的可维护性和扩展性。
  • 性能优化:

    • 物化视图是一种缓存机制,可以将视图的查询结果存储在磁盘上,以提高查询性能。
    • 当基本表的数据频繁变动时,物化视图可以减少查询的计算开销和响应时间,提升系统的性能。

【2】如何使用视图

(1)创建视图

create view 视图名(表名) as 虚拟表的查询SQL语句;

-- 示例
create view my_view(column1,column2) as select column1,column2 from my_table where condition;
  • 在上述语句中
    • my_view 是视图的名称
    • my_table 是源表的名称
    • column1 和 column2 是要选择的列
    • condition 是过滤条件

(2)在视图中查询数据

select * from my_view;

(3)更新视图数据

  • 更新的是视图表的数据而不是原本的表中的数据
UPDATE my_view SET column1 = value1 WHERE condition;
  • 上述语句中
    • column1 是要更新的列, value1 是要设置的值, condition 是更新条件。

(4)删除视图

drop view my_view;

【二】触发器

【1】什么是触发器

在满足对表数据进行增删改的情况下,自动触发的功能,称为触发器

  • 触发器是数据库管理系统中的一个概念,它是一种在数据库中定义的特殊对象,用于在满足特定条件时触发自动化的操作或逻辑。

    • 触发器主要用于监视数据库表的增删改操作,并在满足指定条件时触发相关的响应行为。
  • 触发器通常与数据库表关联,当数据库表发生特定的数据变化时,触发器会自动执行相关的操作

    • 比如插入、更新、删除或查询数据等。
  • 触发器可以作为一种数据库的约束,用于保证数据的完整性和一致性。

【2】触发器的特点

  • 触发器通常与表一起创建、修改和删除。
  • 触发器可以在特定的数据操作之前或之后触发执行。
  • 触发器可以根据用户定义的条件判断是否执行相应的逻辑。
  • 触发器可以调用存储过程、函数、触发其他触发器等,实现更复杂的业务逻辑。

操作之前:插入数据之前对数据进行校验,校验当前用户名是否存在。

操作之后:用户注册成功,插入数据成功,在另一张日志表中记录当前注册成功的日志。

【3】为何使用触发器

可以帮助我们实现日志、监控、处理等操作

  • 使用触发器可以实现很多功能

    • 比如数据验证、数据补全、数据同步、日志记录等。
  • 但需要注意,触发器的使用也需要谨慎,过多或不当的触发器可能会对数据库性能产生负面影响,因此在设计和使用触发器时应考虑到业务需求和性能方面的平衡。

【4】触发器的六种使用情况

  • 增前
  • 增后
  • 删前
  • 删后
  • 改前
  • 改后

【5】语法结构

create trigger 触发器的名字
before/after insert/update/delete
on 表名 for each row 
begin
	SQL语句
end

【6】自定义触发器的流程

(1)创建触发器

  • 使用数据库管理系统提供的语法,创建一个新的触发器对象。
  • 在创建触发器时,您需要指定触发器的名称、触发时机(例如在插入、更新或删除之前或之后)、触发的表以及触发时执行的逻辑。

(2)定义触发器逻辑

  • 在创建触发器时,您需要定义触发器在触发时所执行的逻辑。

    • 这可以是任何数据库支持的操作
  • 比如插入数据、更新数据、删除数据、查询数据等。

    • 您可以使用SQL语句或调用存储过程、函数来实现触发器的逻辑。

(3)定触发条件

  • 根据您的需求,您可以为触发器指定触发条件。

    • 触发条件是一个逻辑表达式,当表中的数据满足该表达式时,触发器才会被激活执行相关的逻辑。
    • 例如,您可以指定只有当某列的值大于特定值时才触发触发器。

(4)绑定触发器

  • 将触发器绑定到相应的表上。一般情况下,触发器会与指定的表相关联,当该表发生特定的数据操作时,触发器才会被触发执行。

(5)测试触发器

  • 在绑定触发器后,您可以进行一些测试操作,验证触发器的逻辑是否按照预期执行。

    • 可以插入、更新或删除数据,观察触发器是否正确地处理这些操作。

【7】示例

(1)创建表

create table cmd(
	id int primary key auto_increment,
    user varchar(32),
    password varchar(10),
    cmd varchar(64),
    sub_time datetime,# 提交时间
    success enum('yes','no') # 0代表执行失败
);
create table errlog(
	id int primary key auto_increment,
    err_cmd varchar(64),
    err_time datetime
);

(2)需求

  • cmd 表插入数据的success如果值为 no 则去errlog表中插入一条记录
delimiter $$  # 将mysql默认的结束符由;换成$$
create trigger tri_after_insert_cmd after insert on cmd for each row
begin
  if NEW.success = 'no' then  # 新记录都会被MySQL封装成NEW对象
      insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);
  end if;
end $$
delimiter ;  # 结束之后记得再改回来,不然后面结束符就都是$$了

(3)往cmd表中插入数据

INSERT INTO cmd (
    USER,
    priv,
    cmd,
    sub_time,
    success
)VALUES
  ('kevin','0755','ls -l /etc',NOW(),'yes'),
  ('kevin','0755','cat /etc/passwd',NOW(),'no'),
  ('kevin','0755','useradd xxx',NOW(),'no'),
  ('kevin','0755','ps aux',NOW(),'yes');

(4)查看数据

select * from cmd;

select * from errlog;

【三】事务

【1】什么是事务

  • 开启一个事务可以包含多条语句,这些语句要么同时成功,要么都不成功

  • 事务是指一系列相关操作的集合,这些操作被视为一个不可分割的工作单元。

  • 事务的目标是确保在多个操作中的每一个都要么全部成功执行,要么全部失败回滚。

    • 即事务的原子性

【2】事务的四大特性(ACID)

(1)原子性(Atomicity)

  • 事务被视为一个原子操作,不可再分割。
  • 要么所有的操作都成功执行,要么所有的操作都会被回滚到事务开始前的状态,确保数据的一致性。

(2)一致性(Consistency)

  • 事务执行前后,数据库应保持一致的状态。
  • 在事务开始之前和结束之后,数据库必须满足所有的完整性约束,如数据类型、关系等。

(3)隔离性(Isolation)

  • 事务的执行结果对其他并发执行的事务是隔离的。
  • 即一个事务的执行不应受到其他事务的干扰,各个事务之间应该相互独立工作,从而避免数据的不一致性。

(4)持久性(Durability)

  • 也叫永久性
  • 一旦事务被提交,其结果应该永久保存在数据库中,并且可以被系统故障恢复。
  • 即使系统发生宕机或崩溃,事务提交后的更改也应该是永久性的。

【3】事务的作用

  • 在操作多条数据的时候,可能会出现某几条操作不成功的情况,需要进行事务回滚

(1)数据一致性

  • 事务可以确保数据库的一致性。
  • 在一个事务中,要么所有的操作都成功执行,要么全部回滚,保证了数据的完整性和一致性。
  • 例如,在一个转账操作中,如果转出账户扣款成功而转入账户未能成功接收资金,事务可以将操作全部回滚,以确保资金的一致性。

(2)并发控制

  • 事务提供了并发控制机制,确保多个并发执行的事务不会相互干扰,并避免数据的混乱和冲突。
  • 通过隔离级别的设置,事务可以控制不同事务之间的可见性和影响范围,保证并发执行时的数据一致性和隔离性。

(3)故障恢复

  • 事务的持久性特性确保了在事务提交后,即使系统发生故障或崩溃,提交的结果仍然可以被恢复。
  • 数据库管理系统通过使用日志文件等机制,将事务的操作记录下来,以便在需要时进行恢复和重放。

(4)高效运行

  • 通过组织多个操作为一个事务,可以减少与数据库交互的次数,从而提高数据库的操作效率和性能。事务可以减少磁盘I/O、锁的竞争等操作开销,提高数据库的并发处理能力。

(5)数据完整性和安全性

  • 事务可以保护数据的完整性和安全性。
  • 通过在事务中定义一些条件和约束,可以确保数据的有效性和准确性。
  • 例如,在一个银行系统中,事务可以检查账户余额是否足够以及转账金额是否合法,从而保证数据的安全性和正确性。

【4】业务示例

  • 检查库存:

    • 系统需要检查所需商品的库存是否足够。
    • 如果库存不足,系统会提示用户库存不足,无法完成订单。
  • 扣减库存:

    • 如果库存充足,系统会将所购商品对应的库存数量减少。
  • 生成订单:

    • 系统会生成一个新的订单,包括订单号、商品信息、购买数量、价格等相关信息。
  • 计算总价:

    • 根据订单中的商品信息和购买数量,系统会计算出订单的总价格。
  • 更新用户账户:

    • 根据用户选择的支付方式,在扣除相应金额后,系统会更新用户账户余额或积分。
  • 生成支付信息:

    • 系统会生成相应的支付信息,以便用户完成支付。
  • 通知物流部门:

    • 系统会通知物流部门准备配送相关商品。
  • 发送订单确认邮件/短信:

    • 系统会向用户发送订单确认的邮件或短信,包括订单详细信息、配送信息等。
  • 监控商品配送:

    • 系统会跟踪订单的配送情况,并向用户提供订单状态更新。
  • 完成订单:

    • 当用户收到商品并确认满意后,订单状态会被更新为“已完成”。
-- 用户下单 ---》支付钱款 ---》资金并不是直接交付商户手中 ---》经过平台缓存 ---》用户点击确认收货之后,资金才会到达商家手中

【5】如何使用事务

# 开启事务
start transaction;

# 回滚(回到事务执行之前的操作)
rollback;

# 二次确认(确认之后无法回滚)
commit;
# 先开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

# 插入数据
mysql> insert into user(username,password) values('opppp',666);
Query OK, 1 row affected (0.00 sec)

# 数据存在

# 发现数据不对,事务回滚
mysql> rollback;
Query OK, 0 rows affected (0.03 sec)

# 数据消失

# 如果确认数据正常,直接提交事务
mysql> commit;
Query OK, 0 rows affected (0.03 sec)

------------ 再次插入数据
# 直接插入数据
mysql> insert into user(username,password) values('opppp',666);
Query OK, 1 row affected (0.04 sec)

# 发现数据存在

# 进行事务回滚
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

# 数据依然存在

标签:触发器,进阶,数据库,事务,视图,查询,MySQL,数据
From: https://www.cnblogs.com/chosen-yn/p/18259480

相关文章

  • docker安装部署mysql
    1.查询mysqldockersearchmysql2.安装mysqldockerpullmysql3.创建挂载目录mkdir-p/tmp/mysql/datamkdir-p/tmp/mysql/conf4.上传hmy.cnf到conf目录[mysqld]skip-name-resolve#设置3306端口port=3306#设置mysql的安装目录datadir=/var/lib/mysql#允......
  • nodejs Sequelize6连接mysql8的配置怎么写
    官方文档的构造器很多,这里仅展示一种const{Sequelize}=require('sequelize');/** *dbname *username *password *options */constsequelize=newSequelize('dbname','username','password',{  host:'127.0.0.1&......
  • MySQL安装流程
    MySQL安装流程1、在除C盘外的期盘中创建一个空白的文件夹(文件夹的名字不要为中文,文件名最后也不要有空格);注意:在这个文件夹的路径中不要出现中文。2、将mysql的压缩包,解压到刚刚创建的文件夹中3、配置环境变量右击此电脑——>属性——>高级系统设置——>高级——>环境变......
  • 腾讯云部署的java服务,访问阿里云的mysql数据库,带宽异常偏高,可能是什么原因
    个人名片......
  • MySQL计算两个地理坐标点之间的球面距离
    st_distance_sphere函数是mysql5.7提供的,可以直接查询两个经纬度之间相距多少米,它接受两个参数,每个参数是一个点的经度和纬度表结构:CREATETABLE`video_alarm`(`alarm_id`char(50)NOTNULL,`alarm_type`varchar(20)DEFAULTNULLCOMMENT'预警类型',`alarm_t......
  • 使用mysqlbackup备份工具加密备份
    1.生成keyecho-n"123456"|shasum-a2568d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92-#注意后面的中划线不算,共64个字符2.方式1:使用key#备份mysqlbackup--defaults-file=/etc/my.cnf--backup-dir=/tmp/fullbak--backup-image=/......
  • Centos7安装mysql8.21
                                                      Centos7安装mysql8.21一、缷载maridb,一般centos都会预装maridb,这个可能会与mysql冲突,先卸载它#查看是否自带maria......
  • 软件测试入门基础03-MySQL
    前言:这是我个人的学习记录,我是科班在读有一定基础,很多东西不会特别详细,欢迎大佬指点,也很高兴有人看了能得到帮助这一小节的内容是MySQL,我已经修完数据库,但时间久远忘记许多于是又看了一遍做个笔记。印象中数据库挺简单,简单的说就是增删改查。我修这门课时把实验做完基本上知......
  • MySQL 常用函数总结
    MySQL提供了丰富的内置函数,用于在查询中进行各种计算、字符串处理、日期和时间操作等。这些函数可以帮助我们更有效地从数据库中检索和处理数据。下面将总结一些MySQL中常用的函数及其用法。1.数值函数1.1ROUND()ROUND()函数用于对数值进行四舍五入操作。SELECTR......
  • 下载MySQL时无法修改存储路径及几个问题
    文章目录前言一、没办法修改下载路径二、只下载了MySQL却没办法可视化总结前言今天在下载MySQL的时候,出现了几个小问题,记录在这里,供大家参考一、没办法修改下载路径我相信这个是大家最头疼的问题,发现根据教程下载的时候出现的选项不是五个,就和图下面这个样子一样......