【问题标题】:How to create an Archive Table with a Mysql Procedure and Date()如何使用 Mysql 过程和 Date() 创建存档表
【发布时间】:2019-09-10 04:23:54
【问题描述】:

我尝试创建一个每天运行一次并存储来自更大表的数据子集的过程。此表的名称应使用 CURDATE() 动态创建。

    DROP PROCEDURE daily_backup;
    DELIMITER |
    CREATE PROCEDURE daily_backup()
    BEGIN
      SET @tbl = CONCAT('items_data_', DATE_FORMAT(CURDATE(), '%Y%m%d'));
      SET @s = CONCAT('DROP TABLE IF EXISTS ', @tbl);
      PREPARE stmt FROM @s;
      EXECUTE stmt;

      @s = CONCAT('CREATE TABLE `', @tb1, '` (`id` int(11) NOT NULL,`up` mediumint(9) NOT NULL,`down` mediumint(9) NOT NULL) ENGINE=Archive');

      PREPARE stmt FROM @s;
      EXECUTE stmt;

      SET @s = CONCAT('INSERT INTO ', @tbl, ' SELECT id,up,down FROM items;');
      PREPARE stmt FROM @s;
      EXECUTE stmt;
    END

这些是结果

#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在 '@s = CONCAT('CREATE TABLE `', @tb1, '` (`id` int(11) NOT NULL,`up` mediumint( 9) ' 在第 8 行

EDIT // 现在工作

    DROP PROCEDURE daily_backup;
    DELIMITER |
    CREATE PROCEDURE daily_backup()
    BEGIN
      SET @tbl = CONCAT('items_data_', DATE_FORMAT(CURDATE(), '%Y%m%d'));
      SET @s = CONCAT('DROP TABLE IF EXISTS ', @tbl);
      PREPARE stmt FROM @s;
      EXECUTE stmt;

      SET @s = CONCAT('CREATE TABLE `', @tbl, '` (`id` int(11) NOT NULL,`up` mediumint(9) NOT NULL,`down` mediumint(9) NOT NULL) ENGINE=Archive');

      PREPARE stmt FROM @s;
      EXECUTE stmt;

      SET @s = CONCAT('INSERT INTO ', @tbl, ' SELECT id,up,down FROM items;');
      PREPARE stmt FROM @s;
      EXECUTE stmt;
      DEALLOCATE PREPARE stmt;
    END

【问题讨论】:

    标签: mysql date procedure archive


    【解决方案1】:

    变量赋值总是需要SET 命令:

    SET @s = CONCAT('CREATE TABLE `', @tbl, '` (`id` int(11) NOT NULL,`up` mediumint(9) NOT NULL,`down` mediumint(9) NOT NULL) ENGINE=Archive');
    

    注意,这个语句中有@tb1,应该是@tbl

    在使用准备好的语句后DEALLOCATE 也是一个好习惯,即

    DEALLOCATE PREPARE stmt;
    

    EXECUTE stmt之后

    【讨论】:

    • 如果我现在尝试运行该过程,我会收到此错误:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在“CALL daily_backup();”之后的第 1 行的“NULL”附近使用正确的语法
    • @kejith 你在这个声明中有@tb1,而不是@tbl
    猜你喜欢
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-03
    • 2021-07-28
    • 1970-01-01
    相关资源
    最近更新 更多