首页 > 其他分享 >视图、触发器、事务

视图、触发器、事务

时间:2022-08-21 17:24:10浏览次数:68  
标签:触发器 create cmd 事务 视图 修改 version

视图

一、介绍

SQL语句的执行结果是一张虚拟表,我们可以基于该表做其他操作

如果这张虚拟表需要频繁使用,为了方便,可以将虚拟表保存起来,宝尊之后就称之为“视图”(本质就是一张虚拟表)

二、代码演示

create view 视图名 as SQL语句;

 create view teacher_course as select * from teacher
    inner join
    course on course.teacher_id = teacher.tid;

image

三、注意事项

1.在硬盘中,视图只有表结构文件,没有表数据文件

视图可以当做表来操作,但是视图只会展示数据

2.视图通常是用于查询,尽量不要修改视图中的数据

视图也不能修改数据

3.视图容易和表造成混淆

分不清是表还是视图,在操作时容易有不必要的麻烦,而且视图会占用硬盘空间,但是Navicat里有作区分

image

总结

视图能尽量少用就尽量少用

触发器

一、介绍

针对表数据的增、删、改自动触发的功能(增前、增后、删前、删后、改前、改后)

二、语法结构

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

三、注意事项

触发器内部的SQL语句需要用到分号,但是分号又是SQL语句默认的字符

所以为了能够完整的写出触发器的代码,需要临时修改SQL语句的默认结束符

delimiter $$  # 把结束符改成>>> $$
编写需要用到分号的各种语句
delimiter ;  # 把结束符改回>>> ;

四、代码演示

CREATE TABLE cmd (
        id INT PRIMARY KEY auto_increment,
        USER CHAR (32),
        priv CHAR (10),
        cmd CHAR (64),
        sub_time datetime,  #提交时间
        success enum ('yes', 'no')  # 0代表执行失败
    );

CREATE TABLE errlog(
 id INT PRIMARY KEY auto_increment,
 err_cmd char(64),
 err_time datetime
);

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 ;  # 结束之后记得再改回来,不然后面结束符就都是$$了

#往表cmd中插入记录,触发触发器,根据IF的条件决定是否插入错误日志
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');

# 查询errlog表记录
select * from errlog;
# 删除触发器
drop trigger tri_after_insert_cmd;

事务

一、事务的四大特征(ACID)

A:原子性

事务是一个完整的操作,事务的各个步骤有一个不完成,就所有步骤全都不会完成

C:一致性

当事务完成时,数据必须处于一致状态

I:隔离性

对数据进行修改的所有并发事务是彼此隔离的。表明事务必须是独立的,他不应以任何方式依赖于或影响其他事物。

D:持久性

不管系统是否发生故障,事务处理的结果都是永久的

二、扩展重要知识

1.MySQL提供两种事务型存储引擎InnoDB和NDB cluster及第三方XtraDB、PBXT

2.事务处理中会反复出现的关键词

事务:transaction

回退:rollback

提交:commit

保留点:savepoint

作用:
	为了支持回退部分事务处理,必须在事务处理块中合适的位置放置占位符,如果需要回退,可以回退到某个占位符(保留点)
# 保留点在执行rollback或者commit之后自动释放 
创建占位符:savepoint
	savepoint sp01;
回退到占位符地址:
	rollback to sp01;

三、四种隔离级别

1.read uncommitted(未提交读)

​ 事务中的SQL语句修改了数据,即使没有事务提交,其他事务也可以读取到未提交时修改后的数据。 —— 脏读现象

2.read committed(提交读=不可重复读)

​ 大多数数据库系统的默认隔离级别

​ 事务A在修改数据时,如果事务A没有提交事务,其他事务不会看到被修改后的数据,也就避免了脏读

​ 但是有可能两个事物同时修改同一表格的数据,底层上会出现问题

3.repeatable read(可重复读)

​ 在一个事务内,最开始读到的数据和事务结束前任意某时刻读到的数据出现不一致,出现幻读现象。

​ 幻读:事务A读取数据,事务B修改添加了新的记录并提交,事务A再次读取数据,会出现幻行。

4.serializable(可串行读)

​ 强制事务串行执行,很少使用该级别。

四、事务日志

1.优点

​ 可以帮助提高事务的效率

​ 存储引擎在修改标的大数据的时候,只需要修改其内存拷贝再把该修改记录到存储在硬盘上的事务日志中,而不用每次都将修改的数据本身存储到磁盘

MVCC多版本并发控制

一、特点

MVCC只能在 read committed(提交读)、repeatable read(可重复读)两种隔离级别下工作,其他两个不兼容(read uncommitted:总是读取最新 serializable:所有的行都加锁)

InnoDB的MVCC通过在每行记录后面保存两个隐藏的列来实现MVCC
一个列保存了行的创建时间
一个列保存了行的过期时间(或删除时间)本质是系统版本号

一个列保存了行的过期时间(或删除时间)本质是系统版本号
每开始一个新的事物版本号都会自动递增,事物开始时刻的系统版本号会作为事物的版本号用来和查询到的每行记录版本号进行比较

例如:刚插入第一条 数据的时候,我们默认事物id为1,实际是这样存储的

username create_version delete_version
jason 1

可以看到我们在content列插入了kobe这条数据,在create_version这列存储了1,1是这次插入操作的事物id
然后我们呢将jason修改为jason01,实际存储是这样的

username create_version delete_version
jason 1 2
jason01 2

可以看到,update的时候,会先将之前的数据delete_version 标记为当前新的事物id,也就是2,然后将新数据写入,将新数据的create_version标记为新的事物id

当我们删除数据的时候,实际存储是这样的

username create_version delete_version
username create_version delete_version
jasion01 2 3

由此当我们查询一条记录的时候,只有满足以下两个条件的记录才会被显示出来:

  1. 当事物id要大于或等于当前的create_version 值,这表示在事物开始签这行数据已经存在了。
  2. 当前事务id要小于delete_version 值,这表示在事务开始之后这行记录才被删除。

二、存储过程

1.类似于python中的自定义函数

语法格式

delmiter 临时结束符
create procedure 名字(参数,参数)
begin
 sql语句;
end 临时结束符
delimiter ;
delimiter $$  #临时修改 结束符
create procedure p1(
 in m int, in  # in表示这个参数必须只能传入不能返回出去
    in n int, in 
    out res int  # out表示这个参数可以被返回出去,还有一个inot 表示即可传入也可以被返回出去
)
begin
 select tanme from teacher where tid > m and tid < n;
 set res=0;  # 用来标志存储过程是否执行
end $$
delimiter ; #改回结束符  

#针对 res 需要先提前定义
set @res=10; 定义
select @res; 查看
call p1(1.5,@res) 调用
select @res 查看

查看存储过程具体信息
 show create procedure pro1;
查看你所有存储过程
 show procedure status;
删除存储过程
 drop procedure pro1;

三、内置函数

可以通过 help 函数名 查看帮助信息

移除指定字符

select Trim()  # 默认移除两边空额

select LTrim

标签:触发器,create,cmd,事务,视图,修改,version
From: https://www.cnblogs.com/Zhang614/p/16610350.html

相关文章

  • spring5 事务
    1.事务介绍1.1事务添加到javaEE的service1.2声明式事务和编程试1.3声明式xml事务开发注解方式1.4在Spring中进行事务开发底层用的aop原理1.5Spring事......
  • mysql事务
    1.事务是什么?2.acid特性3.隔离级别4.实现:mvcc锁undologredolog5.并发异常读异常死锁 目的:事务讲数据库从一种一致性状态转换成另一种一致性状态。组成:事务可以......
  • MySQL之事务和索引
    视图概念:就是有一张或者多张表组织成的结果形成的一张虚拟表,仅仅是为了更便捷的查看数据而产生的,无法使用sql语句做增删改的操作!(不推荐使用)语句结构:createview......
  • 视图、触发器、存储过程、事务(掌握)、内置函数、流程控制、循环结构、索引与慢查询优
    视图SQL语句执行的结果是一张虚拟表,我们可以基于这张表做其他的操作,如果这张虚拟表需要频繁使用,为了方便可以将这张虚拟表保存起来,保存之后就称之为视图(view)。视图的本......
  • 30. Redis---事务(24补充)
    1.前言Redis事务的目的是方便用户一次执行多个命令。执行Redis事务可分为三个阶段:开始事务命令入队执行事务2.Redis事务特性Redis事务具有两个重要特性:1)单......
  • SQL视图
    什么是视图?在SQL中,视图是基于SQL语句的结果集的可视化的表。视图包含行和列,就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段。我们可......
  • 【Spring5学习笔记(4)】事务管理:
    事务1、什么是事务(1)事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,如果有一个失败则所有操作都失败(2)经典场景:银行转账2、事务的四个特性(ACID)(1)原子性:一组逻辑操......
  • 事务与流程与索引
    视图SQL语句的执行后产生的结果是一张虚拟表,我们可以对该表做其他操作,如果这张虚拟表需要频繁使用,那我们就可以将这张虚拟表保存起来,保存起来的就被称为'视图'createvi......
  • Mysql事务控制
    事务Transaction并发控制的基本操作可以看成一系列的SQL语句要么成功,要么失败,失败回滚事务特性ACID原子性Atomicity:事务内的操作要么全部成功,要么全部失败一致性C......
  • tkMapper事务隔离级别_事务的传播机制
    事务的传播机制@Transactional(propagation=Propagation.SUPPORTS)一般来讲,查询操作SUPPORTS带有增删改操作的,REQUIRED,表示是需要事务的隔离级别,可以使用......