mysql事务、触发器、视图、存储过程、函数

事务:mysql

通俗的说事务指一组操做,要么都成功执行,要么都不执行.---->原子性sql

在全部的操做没有执行完毕以前,其余会话不可以看到中间改变的过程-->隔离性编程

事务发生前,和发生后,数据的总额依然匹配----->一致性函数

事务产生的影响不可以撤消------>持久性大数据

若是出了错误,事务也不容许撤消只能经过"补偿性事务"spa

转帐事件

李三: --->支出 500, 李三 -500事务

赵四: ---->收到500, 赵四 +500权限控制

关于事务的引擎:it

选用innodb /bdb

开启事务:  start transaction;

Sql....

Sql....

Commit 提交

rollback 回滚

注意当一个事务commit,或者rollback就结束了

注意:有一些语句会形成事务的隐式的提交,好比 start transaction

事务 的基本原理 (了解)



触发器:trigger, 枪击,扳击,引线的意思

一触即发,

做用监视某种状况并触发某种操做.

观察如下场景:

一个电子商城,

商品表,  g

主键

商品名

库存

1

电脑

28

2

自行车

12

订单表, o

订单主键

商品外键

购买数量

1

2

3

2

1

5

完成下单与减小库存的逻辑

Insert into o (gid,num) values (2,3);  // 插入语句

Update g set goods_num = goods_num - 3 where id = 2;// 更新过程

这两个逻辑能够当作一个总体,或者说, insert ---> 引来 update

用触发器能够解决上述问题.

咱们能够监视某表的变化,当发生某种变化时,触发某个操做.

触发器: 

能监视,,

触发操做,,

四要素:

监视地点

监视事件

触发时间

触发事件

建立触发器的语法

Create trigger triggerName 

After/before insert/update/delete  on 表名

For each row #这句话是固定的

Begin

Sql语句;  # 一句或多句,insert/update/delete范围内

End;

删除触发器的语法:

Drop trigger 触发器名

查看触发器

Show triggers

如何在触发器引用行的值

对于insert而言新增的行 用new 来表示,

行中的每一列的值 ,new.列名来表示.

对于 delete来讲本来有一行,后来被删除,

想引用被删除的这一行,old,来表示,  old.列名,就能够引用被删行中的值.

对于update来讲,

被修改的行

修改前的数据 ,用 old来表示old.列名引用被修改以前行中的值

修改后的数据,new 来表示new.列名引用被修改以后行中的值






视图: view

查询每一个栏目最贵商品 --->

Select goods_id,goods_name,shop_price from goods order by cat_id asc ,shop_price desc

查询结果 当成一张表看

若是某个查询结果出现的很是频繁,也就是,拿这个结果当作进行子查询出现的很是频繁,

Create table g2 like goods;

Insert into g2 select ........

上面两句,是想保存一个查询结果到表里面供其余查询用.

视图的定义:

视图是由查询结果造成的一张虚拟表.

视图的建立语法:

Create view 视图名 as  select 语句;

视图的删除语法:

Drop view 

为何要视图?

:1:能够简化查询

2: 能够进行权限控制

把表的权限封闭,可是开放相应的视图权限,视图里只开放部分数据

3: 大数据分表时能够用到

好比,表的行数超过200万行时,就会变慢,

能够把一张的表的数据拆成4张表来存放

News

Newsid, 1,2,3,4

News1,news2,news3,news4

把一张表的数据分散到4张表里,分散的方法不少,

最经常使用能够用id取模来计算

Id%4+1 = [1,2,3,4]

好比 $_GET['id'] = 17,

17%4 + 1 = 2,  $tableName = 'news'.'2'

Select * from news2 where id = 17;

还能够用视图4张表造成一张视图

Create view news as  select from n1 union select from n2 union.........

视图的修改

Alter view as select xxxxxx

视图与表的关系

视图是表的查询结果,天然表的数据改变了,影响视图的结果.

视图改变了呢?

0: 视图增删改也会影响表

1: 可是,视图并是老是能增删改的.

视图的数据与表的数据 一一对应时,能够修改.

对于视图insert还应注意,

视图必须包含表中没有默认值的列

视图的algorithm

Algorithm = merge/ temptable/ undefined

Merge: 当引用视图时,引用视图的语句与定义视图的语句合并.

Temptable:当引用视图时,根据视图的建立语句创建一个临时表

Undefined:未定义,自动,让系统帮你选.

Merge,意味着视图只是一个规则,语句规则当查询视图时,

把查询视图的语句(好比where那些)与建立时的语句where子句等合并,分析.

造成一条select 语句.

建立视图的语句:

mysql> create view g2 as select goods_id,cat_id,goods_name,shop_price from goods order by cat_id asc,shop_price desc;

查询视图的语句:

 select * from g2 group by cat_id;

最终执行的语句:

select goods_id,cat_id,goods_name,shop_price from goods group by cat_id order by cat_id asc,shop_price desc;

temptable是根据建立语句瞬间建立一张临时表,

而后查询视图的语句从该临时表查数据.

create altorethm=temptable view g2 as select goods_id,cat_id,goods_name,shop_price from goods order by cat_id asc,shop_price desc;

查询视图的语句:

 select * from g2 group by cat_id;

最终执行的2句话取数据并放在临时表,而后去查临时表.


存储过程: procedure

概念相似于函数,就是把一段代码封装起来,

当要执行这一段代码的时候,能够经过调用该存储过程来实现.

在封装的语句体里面,能够用if/else, case,while等控制结构.

能够进行sql编程.

查看现有的存储过程:

Show procedure status

删除存储过程

Drop procedure 存储过程的名字

调用存储过程

Call 存储过程名字();

1个存储过程 ,体会"封装sql"


2个存储过程体会"参数"


3个存储过程,体会"控制结构"


4个存储过程,体会"循环"


mysql,存储过程和函数的区别,

一个是名称不一样,

二个就是存储过程没有返回值.


mysql函数

相关文章
相关标签/搜索