mysql触发定时存储游标

变量

  • 系统变量
    • 查找

    其中% 表示通配符
    SHOW VARIABLES LIKE ‘变量’;
    SHOW VARIABLES LIKE ‘log%’;
    SELECT @@变量
    SELECT @@log_bin

    • 修改

    GLOBAL是指在mysql进程生存期间 都是有效的 重启失效
    SESSION 是指本次连接生存期间 都是有效的
    SET GLOBAL 可改变量 = 值;
    SET SESSION 可改变量 = 值;
    系统变量也可以修改my.ini配置 重启还是生效的

  • 用户变量

在DELIMITER之间使用尽量不要加@ 在外部使用加上@

  • 内部自定义变量 作用域BEGIN与END之间
    • 变量申明
      DECLARE 变量名 变量类型 [DEFAULT 默认值]
    • 变量赋值
      set 变量=值;
   DECLARE i INT(10);
   DECLARE c VARCHAR(50) DEFAULT 'default';
   set i=123;
   set c='char';
  • IN OUT INOUT变量
    • IN 相当于 函数参数 只进不出
    • OUT 相当于 函数返回值 只出不进
    • INOUT 相当于 函数引用参数
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` PROCEDURE `test`(IN `invar` int,OUT `outvar` int,INOUT `inoutvar` int)
BEGIN
###IN变量只能在内部使用 属于内部变量
set outvar=invar;
set inoutvar=3;
END
;;
DELIMITER;
##############################################################################
###外部对OUT变量赋值不能传进去 只出不进
##set @tout=124;
###INOUT变量 不能直接赋值 和函数引用参数一样
set @tinout=124;
call test(12,@tout,@tinout);
select @tout,@tinout;

语句

  • if

IF 条件1 then
语句1
ELSEIF 条件2 then
语句2
ELSE
语句3
ELSE IF;

IF ff%3=2 then 
    RETURN 2;   
ELSEIF ff%3=1 then 
    RETURN 1;  
ELSE
 RETURN 0;  
END IF;
  • case

CASE 变量
WHEN 条件1 THEN
语句1
WHEN 条件2 THEN
语句2
ELSE
语句3
END CASE ;

CASE ff
WHEN 2 THEN
    RETURN 2;   
WHEN 1 THEN 
    RETURN 1;  
ELSE
 RETURN 0;  
END CASE;
  • while

WHILE 条件 DO
语句
END WHILE;

WHILE ff<100 DO
update  `test`.`test` set `f1`=`f1`+1 where id=1;
set ff=ff+1;
END WHILE; 
  • repeat
  • 类似do…while语句 先运行后判断

  • REPEAT
    语句
    UNTIL 退出条件
    END REPEAT;
REPEAT
update  `test`.`test` set `f1`=`f1`+1 where id=1;
set ff=ff+1;
UNTIL ff>200
END REPEAT;
  • loop

标签:LOOP
语句
END LOOP;
中止本次循环
ITERATE 标签; 相对于continue
中止循环
LEAVE 标签;相对于break

set i=0;
test:LOOP
set i=i+1;
IF i%2=1 then 
###奇数跳出循环
    ITERATE test;
ELSE
update  `test`.`test2` set `f1`=`f1`+1 where id=1;
END IF;
IF i>100 then 
###大于100 中止循环
    LEAVE test;
END IF;
END LOOP;

select insert update

  • select

单列 直接赋值

set type=(select `type`  from `test` where `id`=1 limit 1);

多列 select …into
变量名不能和列名一样的

select `cid`,`type` into commentid,ptype from `community_comment_op` where `id`=new.`id` limit 1;
  • insert/update

LAST_INSERT_ID() 返回插入的ID
ROW_COUNT() 返回影响的行数

定时器/事件

注意事项
mysql系统时间 时区是否和php一致
SHOW VARIABLES LIKE ‘time%’;
是否开启定时器
show variables like ‘event_scheduler’;
是否有授权 event权限
show grants;

CREATE EVENT 事件名
ON SCHEDULE
时间格式
ON COMPLETION 结束后是否保存
状态
DO 定时事件;

结束后是否保存 PRESERVE保存 NOT PRESERVE 不保存

状态 ENABLE(默认) 可用 DISABLE 禁止 DISABLE ON SLAVE从服务器上禁止

时间格式
1.定时任务 执行一次
AT timestamp [+ INTERVAL interval]
其中timestamp 格式 xxxx-xx-xx xx:xx:xx 或者CURRENT_TIMESTAMP
interval单位 YEAR | QUARTER季度 | MONTH | DAY | HOUR | MINUTE |WEEK | SECOND
从当前时间间隔10分钟后执行
AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE;
AT 2018-10-26 19:30:03
2.周期性任务
EVERY interval
[STARTS timestamp [+ INTERVAL interval] ]
[ENDS timestamp [+ INTERVAL interval] ]
每5秒执行一次 过30分钟后停止
EVERY 5 SECOND
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 30 MINUTE

过10分钟后清空test表

DELIMITER ;;
CREATE EVENT  test
ON SCHEDULE
AT CURRENT_TIMESTAMP + INTERVAL 10 MINUTE
ON COMPLETION NOT PRESERVE
ENABLE
DO TRUNCATE TABLE `test`;
;;DELIMITER

从现在起每三小时清理过期的验证码

DELIMITER ;;
CREATE EVENT IF NOT EXISTS yzcode_del
ON SCHEDULE EVERY 3 HOUR
STARTS CURRENT_TIMESTAMP
ON COMPLETION  PRESERVE
ENABLE
DO 
BEGIN
###set session time_zone = '+8:00';
DELETE FROM `yzcode` WHERE `expiretime`<CURRENT_TIMESTAMP;
END
;;DELIMITER; 

触发

CREATE TRIGGER 表名 BEFORE|AFTER INSERT|UPDATE|DELETE ON 表名 FOR EACH ROW
触发语句

每次点赞或者倒彩 评论操作表每插入一条 评论表点赞数,倒彩数加一

DELIMITER $$
CREATE TRIGGER `community_comment_op_insert` AFTER INSERT ON `community_comment_op` FOR EACH ROW
BEGIN
declare commentid int;
declare ptype int;
###new.列名 操作之后的新值
###old.列名 操作之后的旧值
###select into !!!变量名和列名要不一样
select `cid`,`type` into commentid,ptype from `community_comment_op` where `id`=new.`id` limit 1;
if ptype=1 then 
    update `community_comment` set `praise_num` = `praise_num` + 1 where `id` = commentid;   
else 
    update `community_comment` set `criticism_num` = `criticism_num` + 1 where `id` = commentid; 
end if;
END
$$DELIMITER

游标

游标相对于结果集的一个指针 操作需要特别小心
申明
DECLARE 游标名 CURSOR FOR 查找语句;
打开
OPEN 游标名;
遍历
!!!变量列表 名字不能列名一样的
FETCH 游标名 INTO 变量列表;
关闭
CLOSE 游标名;

DECLARE done INT DEFAULT FALSE;
DECLARE tid INT;
DECLARE cur CURSOR FOR select `id` from test2;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
OPEN  cur;      
REPEAT
FETCH  cur INTO tid; 
update test2 set `f1`=tid where `id`=tid limit 1;
UNTIL done
END REPEAT;
CLOSE cur;

自定义函数

自定义函数 有返回值 直接执行
存储过程 参数类型IN OUT INOUT 支持事务 使用call执行

DELIMITER $$
CREATE FUNCTION `test`(`i` int)
 RETURNS int(10)
NO SQL
BEGIN
	set i=i+10;
	RETURN i;
END;
$$ DELIMITER 
select test(20);

存储过程

DELIMITER $$
CREATE DEFINER = `root`@`localhost` PROCEDURE `replace`(IN `c` char(255),OUT `rid` int,OUT `isinsert` int)
BEGIN
set rid=0;
select `id` into rid from `test`.`test` where `f1`=c limit 1;
IF rid=0 THEN
insert into `test`.`test` (`f1`)values(c);
set rid=LAST_INSERT_ID();
set isinsert=1;
ELSE
set isinsert=0; 
END IF;
END;

事务

CREATE DEFINER = CURRENT_USER PROCEDURE `test`()
BEGIN
DECLARE rid INT(10);
START TRANSACTION;
insert into `test`.`test` (`f1`)values('kk');
set rid=LAST_INSERT_ID();
IF rid>100 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END;;

修饰符

  • 创建者
    用户名@主机 或者 CURRENT_USER
    DEFINER = root@localhost
  • IF NOT EXISTS 是否存在
  • COMMENT ‘备注’
  • 数据访问:
    CONTAINS SQL包含SQL语句但不包含读或写数据的语句
    NO SQL不包含SQL语句
    READS SQL DATA包含读数据的语句
    MODIFIES SQL DATA包含写数据的语句
  • 安全性:
    SQL SECURITY { DEFINER | INVOKER }
    DEFINER 判定创建者是否有权限
    INVOKER 判定调用者是否有权限

内置函数

AVG()//平均值
COUNT()//计数
MAX()//最大值
MIN()//最小值
SUM()//求和
NOW ( ) //当前时间
CURRENT_TIMESTAMP ( ) //当前时间戳
FORMAT (number,decimal_places ) //保留小数位数
FLOOR (number2 ) //向下取整
CEILING (number2 ) //向上取整

TRIM(string2) //去除指定位置的指定字符
UCASE (string2 ) //转换成大写
LCASE (string2 ) //转换成小写
LENGTH (string ) //string长度
REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str
STRCMP (string1 ,string2 ) //逐字符比较两字串大小,
SUBSTRING (str , position [,length ]) //从str的position开始,取length个字符,
注:mysql中处理字符串时,默认第一个字符下标为1,即参数position必须大于等于1

猜你喜欢

转载自blog.csdn.net/qq_38984126/article/details/83686132