2014-07-17 56 views
0

我创建了mysql事件脚本,旨在每月自动创建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

采取请问这项工作的想法? 'CREATE TABLE IF NOT EXISTS CONCAT(DATE_FORMAT(NOW(),'%​​m_%Y'),'_tableName')(' – hargobind

+0

@hargobind,谢谢,但是我得到错误,你的SQL语法有错误;检查手册(NOW(),'%m_%Y'),'_tableName')('column1' INT(11)NOT NULL,'column2' DAT'at line 4.问题在这里:CONCAT(DATE_FORMAT(NOW(),'%m_%Y'),'_tableName') –

+0

尝试赋值'CONCAT(DATE_FORMAT(NOW(),'%​​m_%Y'),'_tableName')) '给一个变量,并在表名应该去的地方使用变量。 – hargobind

回答

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 /准备/执行从https://dba.stackexchange.com/a/14401

+0

谢谢,代码现在可以工作。 –

2

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

要创建一个像您所描述的变量表名称,您将使用格式化SQL语句作为字符串,然后使用PREPARE and EXECUTE来运行它。

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