我创建了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
答案 0 :(得分:2)
您不能在SQL中将表达式或变量用作标识符。在准备查询时,标识符名称必须是常量。
要创建一个与您描述的变量表名称,您将使用格式化SQL语句作为字符串,然后使用PREPARE and EXECUTE来运行它。
换句话说,在准备语句之前,表达式或变量必须解析为常量标识符名称。
答案 1 :(得分: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