1

我创建 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
4

2 回答 2

2

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

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

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

于 2014-07-17T00:28:59.903 回答
2

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

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

于 2014-07-17T00:36:15.653 回答