目录


​事务​

​事务操作​

​事务特性​

​变量​

​系统变量​

​自定义变量​

​触发器​

​创建触发器​

​查看触发器​

​触发器修改&删除​

​触发器记录​

​SQL执行结构​

​分支结构​

​循环结构​

​函数​

​系统函数​

​自定义函数​

​存储过程​


事务

事务:一系列连续发生的操作

事务安全:一种保护连续操作同时满足(实现)的一种机制,例如银行转账,以保证数据的完整性操作

事务操作

事务操作分为自动操作(默认)和手动操作

手动事务操作的步骤


  1. 开启事务:start transaction;
  2. 事务操作1;
  3. 事务操作2;
  4. 事务操作......;
  5. 关闭事务:commit;#选择性的将日志文件操作的结果保存到数据表中;
  6. 如果事务操作失败,可以使用rollback操作将日志文件清空;

事务操作的原理

开启一个事务之后,事务操作并不会直接对数据表进行操作,而是将操作临时保留到事务日志。事务日志只有在得到commit命令之后才会将事务操作同步到数据表中,在其它情况之下都会清空事务日志(rollback、断电、断开连接...)

回滚点

在事务操作中,在一系列成功的操作之后,后续操作可能会失败,但是如果事务操作失败就返回事务的起点是不合理的,因此可以在成功的事务操作位置设置一个点,用以在后续操作失败之后返回该点,这个点就是回滚点

设置回滚点:savepoint 回滚店名字;

回到回滚点:rollback to 回滚点名字;

自动事务操作

自动事务操作即为事务操作之后,立即同步操作到数据表中,自动事务操作是数据库的默认事务操作

系统通过autocommit对自动事务进行控制

show variables like 'atuocommit'; #查看数据库的默认事务操作

MySQL学习笔记(五)_mysql

set autocommit = off/0; #关闭自动事务

事务特性


  • 原子性:事务的操作是具有原子性,要么全部成功,要么全部回滚
  • 一致性:事务的执行前后必须保持一致性,例如,在AB两人在进行银行转账之前,两人的资金总和为1000,转账后也应为1000
  • 隔离性:多个事务并发访问数据库时,数据库为每个事务开启的事务不会被其它事务干扰
  • 持久性:事务操作之后对数据库而言应当是永久的,一旦操作提交,就不会再出现丢失事务的操作

变量

变量分为系统变量和自定义变量

系统变量

系统定义的变量即为系统变量,主要用于控制服务器的表现,例如:auotcommit、auot_increment等

查看系统变量:show variables; #查看所有系统变量

MySQL学习笔记(五)_自定义_02

MySQL学习笔记(五)_自定义_03

查看具体变量值:select @@系统变量1,@@系统变量2......;

MySQL学习笔记(五)_数据库_04

系统变量的修改

set 变量名 = 值/set @@变量名 = 值; #会话级别的修改,即在关闭数据库连接之后就会失效

set global 变量名 = 值; #全局修改,即修改之后永久生效

全局修改之后需要在MySQL服务器重启之后生效

自定义变量

为了区分系统便量,用户自定义便令使用一个@,并且所有的自定义便量都是会话级别,属于用户属性,与数据库无关

用户自定义变量的查看和修改类似系统变量

在MySQL中,"="是比较符号,系统定义了一个新的赋值符号":="

mysql允许从数据表中获取数据赋予变量

方法一:赋值的同时查看结果

select @变量名 := 字段名 from 数据源; #从数据表中取出数据赋值给变量(只能使用:=)

方法二:赋值的同时不查看结果,但是要求只能有一条记录符合要求

select 字段列表 from 数据源 into 变量列表;

触发器

触发器:tigger,事先为表绑定一个代码段,当数据表中的数据被更改(增删改)之后,系统自动触发这段代码执行

触发器包括三个部分:事件类型、触发时间、触发对象


  • 事件类型有三种:insert、delete、update
  • 触发时间:before、after
  • 触发对象:表中的记录(行)

在一张数据表中一种类型的触发器之能存在一个,即一张表中最多只能有六个触发器

创建触发器

delimiter 自定义符号 create tigger 触发器名 触发器时间 触发器事件类型 on 表名 for each row begin            因为mysql中没有{},因此使用begin和end代替{}表示代码块的开始和结束 触发器内容 end 自定义符号

在触发器内部会分号来标志语句的结束,所以系统会默认判定语句在代码块内部结束,因此需要使用delemiter

在触发器创建完毕之后,使用delemiter将系统结束符修改回;

如果触发器内容只有一条SQL语句,可以省略begin和end语句

查看触发器

查看触发器:show tiggers/show tiggers [like ...];

查看触发器的创建语句:show create tigger 触发器名;

所有的触发器都会保存到一个系统表:information_schema.tiggers中

触发器修改&删除

触发器不能修改,只能先删除再新建

drop tigger 触发器名;

触发器记录

不管触发器是否被触发,只要是某个操作准备执行,系统都会记录当前要操作的数据库状态和即将执行的新的状态分别保留到old和new两种状态中,其中删除操作没有new记录,插入操作没有old记录

SQL执行结构

SQL代码执行结构有三种,顺序结构、分支结构、循环结构

分支结构

事先准备多个代码块,按照条件选择不同的代码块执行

在mysql中只有if分支结构,基本语法如下:

if 条件判断 then     满足条件执行的代码块 else     不满足条件执行的代码块 end if;

循环结构

mysql中只有while循环

基本语法:

while 循环判断 do     --满足条件要执行的代码     --变更循环条件 end while;

在mysql中没有continue和break来对循环进行控制,但是使用了iterate(迭代,类似于continue)和leave(离开,类似于break)对循环进行控制

iterate/leave的使用:

iterate/leave 循环名;        #在创建循环时对循环名进行定义


循环名:while 循环条件 do         --循环体         --循环控制         leave/iterate 循环名; end while;

函数

函数:将一段代码封装到一个结构中,在需要执行代码的时候,调用该结构即可

函数分为系统函数和自定义函数

系统函数

任何函数都有返回值, 因此函数的调用是通过select调用

mysql中,字符串的操作单位通常为字符

自定义函数

函数的结构:函数名、参数列表、返回值、函数体(作用域)

创建函数

基本语法:

delimiter 自定义符号 create function 参数列表([参数1,参数2...]) returns 数据类型 begin         #函数体;         #返回值类型,return 类型(必须和指定的返回类型一致); end 自定义符号

查看函数

查看所有函数:show function status [like ...];

函数是属于指定数据库,只有在对应数据库下才能调用

查看函数的创建语句:show create function 函数名;

修改&删除函数

删除函数:drop function 函数名;

函数参数

function 函数名(形参名 数据类型) returns 数据类型 #参数名必须在数据类型之前

在函数内部使用@符号定义的变量,在函数外部也能够访问

函数体的作用域

MySQL中的全局变量使用set关键字定义,使用@符号标志

MySQL中的局部变量使用declare关键字定义,没有@符号,且所有的局部变量的声明必须在函数体开始之前

存储过程

存储过程简称过程,procedure,是一种用来处理数据的方式

其功能于函数相似,但是没有返回值

创建过程

基本语法:

create proceduce 过程名(参数列表) begin         #过程体 end

查看过程

查看函数的所有方式同样适用于过程

例如:

查看所有函数:show proceduce status [like ...];

函数是属于指定数据库,只有在对应数据库下才能调用

查看函数的创建语句:show create proceduce 函数名;

调用过程

因为过程没有返回值,因此不能使用select关键字对其进行调用

mysql中有一个专用的关键字call来实现过程的调用

过程修改&过程删除

drop proceduce 过程名;

存储过程的参数

过程的参数有三种类型:in、out、inout


  • in,数据只是从外部传入内部,供给内部使用,可以是数值也可以是变量(值传递)
  • out,只允许过程内部使用(不用外部数据),将自己的数据给外部使用(引用传递,但是外部数据会被先清空),只能使用变量
  • 数据既可以在内部使用,也可以在外部使用(引用传递,只能传递变量)

基本语法:

create proceduce 过程名(in 形参名 数据类型) begin         #过程体 end

在调用时,out和inout只能传递一个变量而不能使用值,并且在内部修改也会影响外部

存储过程对变量的操作是滞后的,只有在存储过程被调用结束之后,存储过程内部对变量的修改才能生效