mysql 高级特性基础版

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;没有错误   注意防火墙
  
   此为最简单的主从复制,其他模式还有 被动主主复制、主主互为主从关系、主主互为主从关系然后主主各自还有从服务器
   、环形复制



























猜你喜欢

转载自annan211.iteye.com/blog/2207964