【问题标题】:how to create mysql table names based on the current month and year如何根据当前月份和年份创建mysql表名
【发布时间】:2014-09-07 16:39:49
【问题描述】:

我创建 mysql 事件脚本的目的是每月自动创建 mysql 表。我想要基于当前月份和年份的表格名称。我该怎么做?

我正在尝试这个:

CREATE DEFINER = `root`@`localhost` EVENT `event_name` 
ON SCHEDULE EVERY 1 MONTH 
ON COMPLETION NOT PRESERVE ENABLE 
DO 
CREATE TABLE IF NOT EXISTS  `currentMonth_currentYear_tableName` (
 `column1` INT( 11 ) NOT NULL ,
 `column2` DATETIME NOT NULL ,
 `column3` DECIMAL( 10, 1 ) NOT NULL ,
  PRIMARY KEY (  `column1` )
) ENGINE = INNODB DEFAULT CHARSET = utf8

【问题讨论】:

  • 这行得通吗? CREATE TABLE IF NOT EXISTS CONCAT(DATE_FORMAT(NOW(),'%m_%Y'), '_tableName') (
  • @hargobind,谢谢,但我出错了。您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以获取在 '(NOW(),%m_%Y),_tableName) (column1INT(11) NOT NULL , column2DAT' 附近使用的正确语法4.这里的问题:CONCAT(DATE_FORMAT(NOW(),%m_%Y),_tableName)
  • 尝试将CONCAT(DATE_FORMAT(NOW(),'%m_%Y'), '_tableName')分配给一个变量,并使用表名应该放在的变量。

标签: mysql mysql-event


【解决方案1】:

我没有从事件声明中对此进行测试,但它似乎在我的查询浏览器中工作:

SET @SQL = CONCAT('CREATE TABLE IF NOT EXISTS ', DATE_FORMAT(NOW(),'%m_%Y'), '_tableName (
 `column1` INT( 11 ) NOT NULL ,
 `column2` DATETIME NOT NULL ,
 `column3` DECIMAL( 10, 1 ) NOT NULL ,
  PRIMARY KEY (  `column1` )
) ENGINE = INNODB DEFAULT CHARSET = utf8'
);
PREPARE stmt FROM @SQL;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

CONCAT/PREPARE/EXECUTE 的想法取自https://dba.stackexchange.com/a/14401

【讨论】:

    【解决方案2】:

    您不能在 SQL 中使用表达式或变量作为标识符。在您准备查询时,标识符名称必须保持不变。

    要使变量表名像您描述的那样,您需要将 SQL 语句格式化为字符串,然后使用 PREPARE and EXECUTE 运行它。

    换句话说,表达式或变量必须在您准备语句之前解析为常量标识符名称​​。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-06
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多