【问题标题】:Scheduled event in mysqlmysql中的预定事件
【发布时间】:2017-08-28 00:00:35
【问题描述】:

我有两张表。players 包含所有玩家的详细信息,players_copy 为空.

我需要在 sql 中编写一个预定事件脚本,其中 1 分钟后,来自玩家的 10 行被插入到 player_copy 中。 2分钟后,插入20行..3分钟后30行等等..我写了以下脚本

CREATE EVENT test_event_03
ON SCHEDULE EVERY 1 MINUTE
STARTS CURRENT_TIMESTAMP
ENDS CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
ON COMPLETION PRESERVE
DO
   insert into players_copy
 (
  Player_ID,
  Attributes,
 imagePath, 
 Full_Name, 
 Short_Name, 
 Team_Full_Name,
  Team_Short_Name,
  Team_ID,
  Commentry_Name
 ) 
SELECT *
  FROM players
  ORDER BY Team_Full_Name
 limit 10

但是它一遍又一遍地执行相同的 10 行..它没有递增..有人可以帮助我了解如何更新数据以实现上述条件以及我应该使用存储过程还是随之触发。

【问题讨论】:

  • limit 10 是原因。如果您从10 固定初始记录开始,您可以删除limit 10 条件,以使您的要求工作。
  • 但我想在事件的第一次触发时记录 10 条记录。如果不是限制功能,如何实现这一点
  • 定义一个变量并递增它

标签: mysql sql events stored-procedures triggers


【解决方案1】:

尝试类似:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.17    |
+-----------+
1 row in set (0.00 sec)

mysql> SET GLOBAL event_scheduler = ON;
Query OK, 0 rows affected (0.00 sec)

mysql> USE `_`;
Database changed

mysql> DROP TABLE IF EXISTS `players`, `players_copy`;
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `players` (
    ->   `player_id` BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    ->   `full_name` VARCHAR(255)
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE TABLE IF NOT EXISTS `players_copy` (
    ->   `player_id` BIGINT UNSIGNED,
    ->   `full_name` VARCHAR(255),
    ->   `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP()
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `players` (`full_name`) VALUES
    -> ('Player 1'), ('Player 2'), ('Player 3'), ('Player 4'),
    -> ('Player 5'), ('Player 6'), ('Player 7'), ('Player 8'),
    -> ('Player 9'), ('Player 10'), ('Player 11'), ('Player 12'),
    -> ('Player 13'), ('Player 14'), ('Player 15'), ('Player 16'),
    -> ('Player 17'), ('Player 18'), ('Player 19'), ('Player 20'),
    -> ('Player 21'), ('Player 22'), ('Player 23'), ('Player 24'),
    -> ('Player 25'), ('Player 26'), ('Player 27'), ('Player 28'),
    -> ('Player 29'), ('Player 30'), ('Player 31'), ('Player 32'),
    -> ('Player 33'), ('Player 34'), ('Player 35'), ('Player 36'),
    -> ('Player 37'), ('Player 38'), ('Player 39'), ('Player 40'),
    -> ('Player 41'), ('Player 42'), ('Player 43'), ('Player 44'),
    -> ('Player 45'), ('Player 46'), ('Player 47'), ('Player 48'),
    -> ('Player 49'), ('Player 50'), ('Player 51'), ('Player 52');
Query OK, 52 rows affected (0.00 sec)
Records: 52  Duplicates: 0  Warnings: 0

mysql> DELIMITER //

mysql> DROP EVENT IF EXISTS `test_event_03`//
Query OK, 0 rows affected (0.00 sec)

mysql> CREATE EVENT `test_event_03` ON SCHEDULE EVERY 1 MINUTE
    -> STARTS CURRENT_TIMESTAMP
    -> ENDS CURRENT_TIMESTAMP + INTERVAL 5 MINUTE
    -> ON COMPLETION PRESERVE
    -> DO
    -> BEGIN
    ->   DECLARE `_starts` DATETIME DEFAULT
    ->     (SELECT `STARTS`
    ->      FROM `information_schema`.`EVENTS`
    ->      WHERE `EVENT_SCHEMA` = '_' AND `EVENT_NAME` = 'test_event_03');
    ->   DECLARE `_range` TINYINT DEFAULT
    ->     (SELECT (TIMESTAMPDIFF(SECOND, `_starts`, CURRENT_TIMESTAMP()) / 60) * 10);
    ->   INSERT INTO `players_copy`
    ->   SELECT `player_id`, `full_name`
    ->   FROM `players`
    ->   LIMIT `_range`;
    -> END//
Query OK, 0 rows affected (0.00 sec)

mysql> DELIMITER ;

【讨论】:

    猜你喜欢
    • 2016-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 2022-12-06
    • 1970-01-01
    • 2019-07-08
    • 2013-09-07
    相关资源
    最近更新 更多