游标(cursor)是一个存储在mysql服务器上的数据库查询,它不是一条select语句,而是被该语句检索出来的结果集,在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。Mysql的游标只能用于储存过程。
注意事项:在使用游标之前,必须声明它,这个过程没有检索数据,只是定义要使用的select语句;一旦声明,必须打开游标,以供使用,这个过程用前面定义的select语句把数据实际检索出来;对于填有数据的游标,根据需要检索各行。在结束游标使用时,必须关闭游标。
create procedure processorders()
begin
declare done boolean default0;
declare o int;
declare t decimal(8,2);
注意:declare语句的发布存在特定的次序,用declare语句定义的局部变量必须定义在任意游标或句柄之前,而句柄必须定义在游标之后。
declare ordernumbers cursor
for
select order_num from orders;
declare continue handler forsqlstate '02000' set done=1;//句柄:没找到数据的一行,设置done=1,后又继续执行,多了最后一行
create table if not existsordertotals
(order_num int,
total decimal(8,2));
open ordernumbers;
repeat
fetch ordernumbers into o;
call ordertotal(o,1,t);
insert intoordertotals(order_num,total) values(o,t);
until done end repeat;
close ordernumbers;
end;
触发器是mysql响应delete、insert、和update语句而自动执行的一条mysql语句。
创建触发器时,需要给出4条信息:唯一的触发器名,触发器关联的表,触发器相应的活动,触发器何时执行(处理之前与之后),只有表持支持触发器,视图不支持触发器。
Insert触发器在Insert语句执行之前或之后执行:
l 在insert触发器代码内,可引用一个名为NEW的虚拟表,访问被插入的行
l 在before insert触发其中,NEW中的值可以被更新(允许更改被插入的值)
l 对于AUTO_INCREMENT列,NEW在INSERT执行之前包含0,在INSERT执行之后包含新的自动生成值。
Delete触发器
查看所有的触发器:SELECT* FROM information_schema.triggers;
删除触发器:drop trigger 触发器名;
l 在Delete触发器代码内,你可以引用一个名为OLD的虚拟表,访问被删除的行。
l OLD表的值全都是只读的,不能更新。
l 删除操作时,如果有外键进行约束,则删除不了
l Create trigger deleteorder before delete onorders
l For each row
l Begin
l Insert intoarchive_orders(order_num,order_date,cust_id)
l Values(OLD.order_num, OLD.order_date, OLD.cust_id);
l End;
Update触发器
在Update触发其中,引用一个OLD虚拟表表示访问以前的值(update语句前的值),引用一个NEW虚拟表表示访问更新的值。
在beforeupdate触发其中,NEW的值也可能被更新(允许更改将要用于UPDATE语句的值)
Create trigger updatevendorbefore update on vendors
For each row setnew.vend_state=upper(New.vend_state);
OLD中的值全是只读,不能更新
更新一行触发一行,更改多行,触发多行
事务处理用来管理insert、update、delete语句。不能回退create或drop操作。
隐函事务关闭 当commit或rollback语句执行后,事务会自动关闭,保留点在事务处理完成之后自动释放。
Show character set;这条语句显示所有可用的字符集以及每个字符集描述和默认校对。
Show collation;显示所有可用的校对列表。
在创建数据库时,指定默认的字符集和校对,为确定所用的字符集和校对,使用show
Variables like ‘character%’;和showvariable like ‘collation%’;
其中校对在对orderby子句检索出来的数据排序起重要作用,
管理用户:mysql用户账号和信息存储在名为mysql的MYSQL的数据库中。
Select user from user;
创建用户账号:createuser admin@’%’ identified by ‘密码’;
重新命名一个用户账号,使用renameuser admin to li;
删除用户drop user admin;
查看用户的权限:showgrants for admin;
权限USAGEON *.*:表示在任意数据库和任意表上对任何东西都没有权限。
设置权限:grant要给出 要授予的权限;被授予访问权限的数据库或表;用户名
Grant select on commerce.* toadmin;
Revoke撤销给定的权限
Revoke select on commerce.*from admin;
Grant 和revoke可在几个层次上控制访问权限:
整个服务器:使用grantall和revoke all;
整个数据库使用:ondatabase.*
特定的表:ondatabase.table;
特定的列和特定的存储过程
更改用户口令:setpassword for admin=password(‘admin’);
设置自己的用户口令:setpassword=password(‘admin’);