【问题标题】:create a table with date name创建一个带有日期名称的表
【发布时间】:2013-06-14 10:19:10
【问题描述】:

我正在编写一个简单的程序来备份一个表-

CREATE PROCEDURE daily_backup()
BEGIN
   DECLARE given_date VARCHAR(25);
   SET given_date = now(); 

   CREATE TABLE given_date LIKE db1.table1;
   INSERT INTO given_date SELECT * FROM db1.table1;


END

但它会创建一个名为 given_date 的表。我想创建一个以日期为名称的表。怎么做?

【问题讨论】:

  • 作为表名的日期不是有效的 SQL 标识符。你至少应该给它加上前缀,这样你就不会遇到非标准名称的麻烦

标签: mysql database stored-procedures


【解决方案1】:

使用prepare 生成create 语句:-

set @given_date = now();
SET @sql = CONCAT("CREATE TABLE ",@given_date," as SELECT * FROM db1.table1");
PREPARE stmt from @sql;
EXECUTE stmt;

ps:- 根据to this.,表名应该是有效的

【讨论】:

    【解决方案2】:

    试试这个

    DELIMITER |
    CREATE PROCEDURE daily_backup()
    BEGIN
      SET @s = CONCAT('CREATE TABLE bak_', DATE_FORMAT(CURDATE(), '%Y%m%d'), ' SELECT * FROM table1');
      PREPARE stmt FROM @s;
      EXECUTE stmt;
    END
    |
    DELIMITER ;
    

    更新:您可以让它一天运行多次

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

    这里是SQLFiddle演示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-27
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      相关资源
      最近更新 更多