mysql事件EVENT详解


mysql事件是mysql内部符合一定条件触发的数据库对象

查看mysql的事件服务是否开启:

mysql> show variables like 'event_scheduler';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| event_scheduler | OFF   |
+-----------------+-------+
1 row in set

临时开启事件服务(重启mysql之后可能失效配置,会从配置读):

mysql> SET GLOBAL event_scheduler = ON;
Query OK, 0 rows affected

mysql> SET @@global.event_scheduler = ON;
Query OK, 0 rows affected

永久设定,打开my.cnf(Windows的phpstudy是my.ini)

[mysqld]
event_scheduler=ON

然后重启mysql服务即可。

例子1. 在早上6点钟后,每分钟自动增加auto_increment几十

DELIMITER $$

DROP EVENT IF EXISTS `blog_increment_random`;
CREATE EVENT `blog_increment_random`
ON SCHEDULE EVERY 1 MINUTE
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT '每分钟随机增加自增id的自增值'
DO
BEGIN
SET AUTOCOMMIT = 0;
SET @FINALID = (
    SELECT
        (
            DATE_FORMAT(NOW(), '%i') + FLOOR(1 +(RAND() * 2))
        ) % 10 * FLOOR(1 +(RAND() * 60)) + AUTO_INCREMENT
    FROM
        information_schema. TABLES
    WHERE
        table_name = "sdb_blog"
);
SET @FINALID = (
    IF (
        DATE_FORMAT(NOW(), '%H') > 6,
        @FINALID,
        NULL
    )
);
INSERT INTO sdb_blog (`id`)
VALUES
    (@FINALID);
ROLLBACK;
SET AUTOCOMMIT = 1;

END $$

DELIMITER ;

例子2. 时时刻刻每分钟增加0或1的例子:

DELIMITER $$

DROP EVENT IF EXISTS `事件名_randinc`;
CREATE EVENT `事件名_randinc`
ON SCHEDULE EVERY 1 MINUTE STARTS '2020-02-02 00:00:00' 
ON COMPLETION NOT PRESERVE
ENABLE
COMMENT '每分钟随机增加自增id的自增值'
DO
BEGIN
SET AUTOCOMMIT = 0;
SET @FINALID = (
    SELECT FLOOR(RAND() * 2) + AUTO_INCREMENT
    FROM information_schema.TABLES
    WHERE table_schema = "数据库名" AND table_name = "表名全名"
);
INSERT INTO 表名全名(`id`) VALUES (@FINALID);
ROLLBACK;
SET AUTOCOMMIT = 1;

END $$
DELIMITER ;

还有一个简单粗暴的:

-- 每分钟随机增加自增id的自增值 auto_plus_ids
BEGIN
SET AUTOCOMMIT = 0;

-- RANDINT 为100以内的随机整数
SET @RANDINT = (SELECT FLOOR(RAND() * 100));

-- 场景1:交易订单的随机自增
IF @RANDINT > 1 THEN
  INSERT INTO cdb_trade(`delete_time`) VALUES (123456789);
  ROLLBACK;
END IF;

-- 场景2:xxxxxx



SET AUTOCOMMIT = 1;
END

原文链接:https://blog.yongit.com/note/143535.html