mysql(触发器,变量,作用域,结构,存储过程,用户管理).doc
回顾
PHP操作mysql
连接认证
发送SQL/接收SQL执行结果
解析结果
释放资源(结果集和连接)
SQL语法错误:mysql_errno()和mysql_error()
触发器
触发器:事先写好一段代码,与某个表中的某条记录进行绑定,然后在记录中发生某些指定的事情的受,这段代码就会自动的执行。
需求:商品库存管理,商品表和订单表,订单会包含商品信息,如果订单增加意味着商品库存就应该减少,订单退单,商品库存应该增加。
真实项目数据库设计思路
先新增订单信息,获取订单id
通过订单id得到当前订单信息(可以省略)
通过订单信息,修改商品库存
触发器组成
触发时间,事件类型,要做的事情,触发对象
创建触发器
语法
createtrigger触发器名字触发时间触发事件on表名(触发对象)foreachrow
begin
要做的事情
//要做的事情都是SQL语句,每行SQL语句都需要结束符号分号
end
触发时间:前和后
before:数据被操作之前(写数据表之前)
after:数据被操作之后(数据写入到数据表之后)
触发事件:增删改
insert:插入数据
delete:删除数据
update:修改数据
一张表中最多可以有6个触发器。一张表中,只能由一种同类型触发器。
语句结束符
delimiter临时语句结束符
//所有内容都不会以分号结束,系统直到碰到临时语句结束符
delimiter;
//系统又重新已分号作为语句结束符
使用触发器
触发器不需要手动的调用,只要对应表的操作满足条件之后,系统会自动的调用触发器,执行里面的内容。
查看触发器
语法
showtriggers;
查看单独触发器
showtriggerslike‘pattern’
查看触发器创建语句
showcreatetrigger触发器名字
修改触发器
触发器不能修改,只能先删除后新增
删除触发器
语法
droptrigger触发器名字;
获取触发语句内容
触发器中系统会自动的获取到当前被操作记录的原始值和操作后的新值:old和new
old:代表当前表中尚未执行SQL语句前的原始记录,新增数据没有old记录,在beforeinsert触发器中不能使用old关键字
new:代表当前表中的记录已经SQL执行修改过后的数据,删除数据没有new记录,在afterdelete中不能使用new关键字(即便当前SQL并没有真正执行,new也能得到执行后的结果)
访问记录中的字段的语法
old/new.字段名
效果
作业
一张表最多能放多少个触发器?6个
哪些触发器中不可以使用old或者new?
insertonduplicate会触发多少个触发器?假设6个都全。replaceinto又会触发多少个?
变量
在SQL中变量分为两种:系统变量和自定义变量
系统变量
系统在启动的时候已经定义好的变量,用户只需要使用就行了。
有哪些系统变量?
showvariables;
如何读取系统变量的值?
语法
select@@系统变量名;
如何修改系统变量?
语法
set变量名=值;
以上修改:只有当前用户当次连接是有效的,断开连接就失效。(会话级别)
全局生效(整个服务器的环境不管是哪个客户端,什么时候连接都生效)
setglobal.变量名=值;
如果想要全局修改,最好的办法是修改配置文件my.ini
自定义变量
用户自己定义的变量。
定义变量
语法1:普通设置
set@变量名=值;
语法2:使用专门赋值语法
set@变量名:=值;
语法3:批量定义
select字段列表from表名into变量列表;
select字段列表into变量列表from表名;
select变量:=字段,列表from表名;
使用以上三种方式定义变量的必须要满足条件
字段数与变量的数量必须一致
select查询得到的记录结果必须只能是一条记录
注意:虽然系统会保存,但是系统会自动将第一条记录对应的结果给变量赋值
访问变量
与系统变量访问的方式类似。
select@变量名;
修改变量
set@变量名=值;
删除变量
SQL中不能删除变量,只能将变量置空
函数
什么是函数?
实现某一功能的代码块,能够允许被重复利用。
函数要素有哪些?
关键字,函数名,参数(形参和实参),函数体,返回值
SQL是一种强类型语言,函数一定需要指定返回值。
函数分为系统函数和自定义函数。
自定义函数
创建函数
语法
createfunction函数名(参数列表[参数列表必须指定参数类型])returns返回值类型
begin
//函数体
//返回值
//如果一个函数体(触发器和存储过程)里面