mysql中语句块当事务,PHP笔记之MySQL(5)

删除用户:

drop  user  ‘用户名’@’允许登录的地址或服务器名’;

修改用户密码:

修改自己的密码:

set password = password('密码');

修改他人的密码(前提是有权限):

set password  for  '用户名'@'允许登录的地址' = password('密码');

权限管理

权限是什么?

mysql数据库,将其中所能做的所有事情,都分门别类分配到大约30多个权限中去了,其中每个权限,都是一个“单词”而已!,比如:

select:代表可以查询数据;

update:代表可以修改数据;

delete:代表可以删除数据;

.......

其中,有一个权限名叫做“all”:表示所有权限;

有如下权限:

另一个表现形式(带中文说明):

授予权限:

形式:grant  权限列表  on  某库.某个对象  to  ‘用户名’@’允许登录的位置’  【identified  by  ‘密码’】;

说明:

1,权限列表,就是,多个权限的名词,相互之间用逗号分开,比如:  select,  insert,  update

也可以写:all

2,某库.某个对象,表示,给指定的某个数据库中的某个“下级单位”赋权;

下级单位有:表名,视图名,存储过程名;  存储函数名;

其中,有2个特殊的语法:

*.*: 代表所有数据库中的所有下级单位;

某库.* :代表指定的该库中的所有下级单位;

3,【identified  by  ‘密码’】是可省略部分,如果不省略,就表示赋权的同时,也去修改它的密码;

但:如果该用户不存储,此时其实就是创建一个新用户;并此时就必须设置其密码了

剥夺权限:

形式:revoke  权限列表  on  某库.某个对象  from  ‘用户名’@’允许登录的位置’  其含义,跟grant中完全一样;

事务控制语言

什么叫做“事务”:

想象一个场景:

小明给小花 汇款 5000元 买 IPHONE,操作界面不用管,不管什么操作界面,最终都要落实到这样两条语句的执行:

update  存款表  set  money = money - 5000  where  账户=’小明’;

update  存款表  set  money = money + 5000  where  账户=’小花’;

当,第一条语句执行成功,突然断电了(或任何其他情况),就会造成数据的“不一致”。

要解决这个问题,就是“事务”的功能:

事务就是用来保证多条“增删改”语句的执行的“一致性”:要么都执行完成,要么都没有执行;

事务的特点:

原子性:一个事务中的所有语句,应该做到:要么全做,要么一个都不做;

一致性:让数据保持逻辑上的“合理性”,比如:一个商品出库时,既要让商品库中的该商品数量减1,又要让对应用户的购物车中的该商品加1;

隔离性:如果多个事务同时并发执行,但每个事务就像各自独立执行一样。

持久性:一个事务执行成功,则对数据来说应该是一个明确的硬盘数据更改(而不仅仅是内存中的变化)。

事务模式:

事务模式是指:

在我们的cmd命令行模式中,是否开启了“一条语句就是一个事务”的这个开关:

默认情况下(安装后),这个模式是开启的,称为“自动提交模式”;

set  autocommit = 1;

这样之后,每条增删改语句,都会立即生效;

我们可以把它关闭,那就是“人为提交模式”——即需要人为提交;

set  autocommit = 0;

这样之后,所有增删改语句,都必须使用commit之后,才能生效;

首先,我们以前的经验都是:一条增删改语句,一旦回车,执行就完成(前提是不出错);

现在,我们关闭该模式:

然后,再去执行一条简单的insert语句:

对比:

执行前:然后,执行insert:

事务执行的基本流程

1,开启一个事务:

start  transaction; //也可以写成:begin;

2,执行多条增删改语句; //也就是相当于希望这多条语句要作为一个“不可分割”的整体去执行的任务

3,判断这些语句执行的结果情况,并进行提交或回滚:

if(  没有出错 ){

commit; //提交事务;此时就是一次性完成;

}

else{

rollback; //回滚事务;此时就是全部撤销;

}

具体分2种情况来做:

在cmd中,就是凭“肉眼”观察是否有错:

没有错误的情况:

在php中:

mysql编程

mysql编程中语句块包含符:

其实就是相当于js或php中大括号语法:

[标识符:]begin

//语句。。。。

end  [标识符];

标识符就是定义定义的任意的名字而已,比如:

if  (条件判断)

begin

//。。。。

end;

end if;

if  (条件判断)

A:begin

//。。。。

end  A;

end if;

A就是标识符,它的作用是“标识”该语句块,以期可以在该语句块中“使用它”——其实就是退出;

流程控制语句

if语句:

case语句:

相当于之前的switch,它有两种语法:

loop循环语句

while 循环

repeat 循环

leave语句:

语法:leave 标识符;

作用:用来退出begin...end结构或其他具有标识符的结构。

mysql中的变量:

mysql中,有两种变量形式:

普通变量: 不带“@”符号;

定义形式: declare  变量名  类型名   【default  默认值】; //普通变量必须先这样定义

赋值形式:set  变量名  =  值;

取值:就直接使用变量名;

使用“场所”:只能在“编程环境”中使用;

什么是编程环境?只有3个:

1,定义函数的内部;

2,定义存储过程的内部;

3,定义触发器的内部;

会话变量: 带“@”符号;

定义形式(其实也是赋值形式):

set  @变量名  =  值; //跟php类似,无需定义,直接赋值,第一次就算是定义

取值:就直接使用变量名;

使用“场所”:基本上哪里都可以用;

变量赋值有如下形式:

语法1(针对普通变量):

set 变量名 = 表达式;#此语法中的变量必须先使用declare声明

语法2(针对会话变量):

set @变量名 = 表达式; #此方式可以无需declare语法声明,而是直接赋值,类似php定义变量并赋值。

语法3(针对会话变量):

select @变量名 := 表达式;#此语句会给该变量赋值,同时还会作为一个select语句输出“结果集”。

语法4(针对会话变量):

select 表达式 into @变量名;#此语句虽然看起来是select语句,但其实并不输出“结果集”,而只是给变量赋值。

(存储)函数:

函数,也说成“存储函数”,其实就是js或php中所说的函数!

唯一的区别:这里的函数必须返回一个数据(值);

定义形式:

注意事项:

1, 在函数内容,可以有各种变量和流程控制的使用;

2, 在函数内部,也可以有各种增删改语句;

3, 在函数内部,不可以有select或其他“返回结果集”的查询类语句;

举例:

调用形式:

跟调用内部函数一样!比如:

select  now(),  8+3 as f2,   func1(); //这里,now()是系统函数; func1()是自定义函数。

或如果在编程语句中:

set  @v1 = now();

set  @v2 = func1();

删除函数:

drop  function  函数名;

存储过程procedure

存储过程,其本质还是函数——但其规定:不能有返回值;

定义形式:

说明:

1,in:用于设定该变量是用来“接收实参数据”的,即“传入”;默认不写,就是in

2,out:用于设定该变量是用来“存储存储过程中的数据”的,即“传出”,即函数中必须对他赋值;

3,inout:是in和out的结合,具有双向作用;

4,对于,out和inout设定,对应的实参,就“必须”是一个变量,因为该变量是用于“接收传出数据”;

调用存储过程:

call  存储过程名 (实参1,实参2,.... )

它应该是在“非编程环境中”调用,即执行增删改查的场景下;

举例1:

#创建一个存储过程:

#该存储过程的目标是:将3个数据写入到表tab_int;

#并返回该表的第一个字段的前3大值的行

举例2(使用in,out,inout):

删除存储过程:

drop  procedure  存储过程名;

在php中使用存储函数或存储过程的示意

//调用存储函数:

$v1 = $_POST[‘a’];

$v2 = $_POST[‘b’];

$sql = “insert  into  tab1  (id,  f2,  f3)  values ( null,  now(),  func1($v1 , $v2 )  )”;

$result  =  mysql_query($sql);

//调用存储过程:

$v1 = $_POST[‘username’];

$v2 = $_POST[‘pass’];

$v3 = $_POST[‘age’];

$sql = “ call   insert_user($v1, $v2,  $v3 ); ”; //insert_user()是一个存储过程,带3个参数,会将该3个参数数据写入(insert)某个表中。

$result = mysql_query();

另一个使用存储过程返回结果集的例子:

$id = $_GET[‘id’];

$sql = “call  Get_User_Info( $id )  “; //Get_User_Info()是一个存储过程,其中会返回某个指定id的用户信息

$result = mysql_query($sql); //这里得到的就是“结果集”了

?>

触发器(trigger)

含义:

触发器,也是一段预先定义好的编程代码(跟存储过程和存储函数一样),并有个名字。

但:

它不能调用,而是,在某个表发生某个事件(增,删,改)的时候,会自动“触发”而调用起来。

定义形式:

create  trigger  触发器名  触发时机  触发事件   on  表名   for  each  row  as

begin

//这里,才是编程的位置,也就是触发器的内部语句

end;

说明:

1,触发时机,只有2个:  before(在....之前),  after(在....之后);

2,触发事件,只有3个:insert,  update,  delete

3,即其含义是:在某个表上进行insert(或update,或delete)之前(或之后),会去执行其中写好的代码(语句);即每个表只有6个情形会可能调用该触发器;

4,通常,触发器用于在对某个表进行增删改操作的时候,需要同时去做另外一件事情的情形;

5,在触发器的内部,有2个关键字代表某种特定的含义,可以用于获取有关数据:

new:它代表当前正要执行的insert或update的时候的“新行”数据;通过它,可以获取这一新行数据的任意一个字段的值,形式为:

set  @v1 = new.id; //获得该新插入或update行的id字段的值(前提是有该id)

set  @v2 = new.age; //同上;

old:它代表当前正要执行的delete的时候的“旧行”数据,通过它,可以获取这一旧行数据的任意一个字段的值,形式为:

set  @v1 = old.id; //获得该新插入或update行的id字段的值(前提是有该id)

set  @v2 = old.age; //同上;

PHP笔记之MySQL(5)相关教程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值