1 _Mysql高级.001.理解触发器
商品表 goods 订单表 org
1
delimiter$
create trigger t1
after
insert
on org for each row
begin
update goods set num=num-2 where gid = 1;
end$
show triggers $ 显示触发器 此时的结束符已从;变为$
2 _Mysql高级.003.触发器中引用行变量
delimiter$
create tigger t1
alter
insert
on org for each row
begin
update goods set num=num-new.much where gid=new.gid;
end$
truncate goods; 清空数据
drop tigger t2; 删除触发器
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
恢复订单
delimiter$
create tigger t2
after
delete
on org for each row
begin
update goods set much=much+old.num where gid=old.gid;
end$
3 _Mysql高级.004.再谈行变量
delimiter$
create tigger t3
before
update
on org for each row
begin
update goods set much=much+old.num-new.num where gid=old.gid
end$
4 _Mysql高级.005.触发器做简单编程
触发器before 与 after
delimiter$
create trigger t4
before
insert
on org for each row
begin
declare int rnum;
select num into rnum where gid=new.gid;
if new.num > rnum then
set new.num=rnum
end if;
update goods set num=much-new.num where gid=new.gid;
end$
5 _MySQL高级.006.for each row是干吗的
触发器分为 行级触发器 和 语句级触发器
行级触发器 影响了多少行就会触发多少次 语句级 则是执行了多少次语句
触发几次。
1 for each row 行级触发器 mysql目前不支持语句级触发器
所以去除for each row 会发生语法错误。
6 _MySQL高级.007.存储过程概念
过程 与 函数的区别
函数有返回值 过程没有返回值
过程-----把若干条sql封装起来 就叫过程
存储过程----- 把过程存储到数据库中
1 create procedure procedureName()
begin
end;
2 show procedure status; 查看
3 call procedureName(); 调用
7 _MySQL高级.008.引入变量与控制结构
1 过程中声明变量
declare age int default 20;
2 delimiter$
create procedure p2()
begin
declare age int default 18;
declare height int default 180;
select concat('身高',height,'年龄',age);
end$
3 create procedure p3()
begin
declare age int default 18;
set age := age + 20;
select concat('20年后年龄是',age);
end$
4 if/else 控制结构
create procedure p4()
begin
declare age int default 18;
if age >= 18 then
select '成年';
else select '未成年';
end if;
end$
8 _MySQL高级.009.存储过程的参数传递
1 存储过程传参数
delimiter$
create procedure p5(width int,height int)
begin
select concat('your area is ',width*height) as area;
if(width>height) then
select '宽';
elseif(width < height) then
select '高';
else then
select '方';
end if;
end$
9 _MySQL高级.010.过程中使用循环结构
顺序 选择 循环
1 1-100
delimiter $
create procedure p6()
begin
declare total int default 0;
declare num int default 0;
while num <= 100 do
set total := total +num;
set num := num+1;
end while;
select concat('the total is ',total) as res;
end$
2 in 型参数 可以不写in标记
create procedure p7(in n int)
begin
declare total int default 0;
declare num int default 0;
while num <= n do
set total := total + num;
set num := num+1;
end while;
select concat('the total is ',total) as res;
end$
3 out型参数
传入参数 /传出参数
create procedure p8(in n int,out total int)
begin
declare num int default 0;
set total := 0;
while num <= n do
set total:= total+num;
set num := num +1;
end while;
select concat('the total is ',total) as res;
end$
call p8(100,@sum)$
select @sum // 5050
4 inout 参数
create procedure p9(inout age int)
begin
set age := age+20;
end$
调用过程
set @curreAge = 18$
call p(@curreAge)$
select @curreAge
10 _MySQL高级.012.Case结构的用法
1 case
create procedure p10(pos int)
begin
case pos
when 1 then
select 'flying.....';
when 2 then
select 'has down';
else
select 'nobody known it ';
end case;
end$
floor(rand()*7) // 0-7
11 _MySQL高级.013.repeat循环结构
1 create procedure p11()
begin
declare total int default 0;
declare num int default 0;
repeat
set num := num+1;
set total := total + num;
until num >100 end repeat;
select concat('repeat result is ',total) as res;
end$
12 _MySQL高级.014.游标的概念
1 declare /open / fetch /close
delimiter $
create procedure p12()
begin
declare row_id varchar(50) default 'id';
declare row_name varchar(50) default 'name';
declare row_password varchar(50) default 'pass';
declare getuser cursor for select id,name,password from ls_user;
open getuser;
fetch getuser into row_id,row_name,row_password;
select row_id,row_name,row_password;
close getuser;
end$
13 _MySQL高级.015.游标循环
声明变量 一定要在 声明游标之前
create procedure p13()
begin
declare row_id varchar (50) default 'id';
declare row_name varchar(50) default 'name';
declare row_password varchar(50) default 'password';
declare count int default 0;
declare i int default 0;
declare getuser cursor for select id,name,password from ls_user;
select count(*) from ls_user into count;
open getuser;
repeat
set i := i+1;
fetch getuser into row_id,row_name,row_password;
select row_id,row_name,row_password;
until i >=count end repeat;
close getuser;
end$
请尊重知识,请尊重原创 更多资料参考请见 http://www.cezuwang.com/listFilm?page=1&areaId=906&filmTypeId=1
mysql 触发事件
mysql 允许声明 触发事件 改变变量值
declare continue handler 来操作一个越界标示
declare continue handler for NOT FOUND statement;
越界标识必须在游标声明之后声明
create procedure p14()
begin
declare row_id varchar (50) default 'id';
declare row_name varchar(50) default 'name';
declare row_password varchar(50) default 'password';
declare you int default 1;
declare getuser cursor for select id,name,password from ls_user;
declare continue handler for NOT FOUND set you := 0;
open getuser;
repeat
fetch getuser into row_id,row_name,row_password;
select row_id,row_name,row_password;
until you=0 end repeat;
close getuser;
end$
14 _MySQL高级.017.对比continue与exit的区别
1 前面一节 declare continue handler NOT FOUND set you := 0;
虽然可以完成逻辑,但是在最后一行取出时会发现,重复取出。
可以使用 exit触发事件 解决这个问题。
delimiter $
create procedure p15()
begin
declare row_id varchar (50) default 'id';
declare row_name varchar(50) default 'name';
declare row_password varchar(50) default 'password';
declare you int default 1;
declare getuser cursor for select id,name,password from ls_user;
declare exit handler for NOT FOUND set you := 0;
open getuser;
repeat
fetch getuser into row_id,row_name,row_password;
select row_id,row_name,row_password;
until you = 0 end repeat;
close getuser;
end$
continue exit 之外 还有undo handler
continue 触发之后 后面的语句继续执行
exit 触发之后 后面的语句不在执行
undo 触发之后 前面的语句撤销 (目前mysql还不支持undo)
15 _MySQL高级.018.游标循环读取的正确逻辑
1
16 _MySQL高级.019.MySQL权限检查原理
17 布尔教育_MySQL高级.022.主从复制原理
1 主服务器配置binlog
2 从服务器配置relavlog
3 从主服务器读取到的binlog 转换为自身可执行的relavlog(授权)
4 执行relavlog
具体操作步骤
1 编辑 my.conf
1 由于数据复制可能会发生在主主之间 主从复制 一主多从等模式
为避免发生混乱 所以需要给每台MySQL数据 标记唯一的id
#server-id=10.211.2.109
2 这里把109服务器 配置为主,所以配置其log-bin
#log-bin=mysql-bin mysql-bin 为日志名称
3 二进制日志的格式
格式分为 混合模式 mixed,行级row,块statement
#binlog-format=row/statement/mixed
row :二进制记录的是磁盘的变化
statement:二进制记录语句 如 update 。。。
如何取舍?
update age=age+3 where id=9;//语句长而磁盘变化山,宜使用row
update age =age+3;//语句端 但影响上万十万行 磁盘变化大,宜使用statement
如果取舍不定 请使用mixed ,由系统根据语句决定。
2 从服务器配置
1 server-id=10.244.2.110
2 log-bin=mysql-bin #从服务器也开启bin日志的原因是为了备份日志文件
以及 可以从 从服务器往下再配置从服务器的从。
3 relay-log=mysql-relay
4 binlog-format=mixed
3 启动两台主从服务器即可。
109 :show master status 查看主日志
110:show slave status
主服务器授权 假定我们要建立的这个账户为repl,密码为repl,
mysql>grant replcation client,replication slave on *.* to repl@'192.168.1.%' identified by 'repl'
mysql>flush privileges;
从服务器上配置主服务器地址
mysql>change master to
master_host='10.244.2.110',
master_user='repl',
master_password='repl',
master_log_file='mysql-bin.00001' #此文件为从哪个bin开始读取 具体在主服务器查看 show master status
master_log_pos=348; #此标记为已经读取到了哪个位置 具体在主服务器查看 show master status
从服务器查看连接状态 show slave status;
状态正确 从服务器 启动 MySQL>start slave;
查看 mysql>show slave status;没有错误 注意防火墙
此为最简单的主从复制,其他模式还有 被动主主复制、主主互为主从关系、主主互为主从关系然后主主各自还有从服务器
、环形复制