2017-02-10 94 views
1

我正面临一个动态创建表名的问题。MYSQL存储过程从日期创建动态表

例如, 该查询返回(SELECT DATE_FORMAT(NOW(),'%Y%m'))201702

我的动机是检查表是否存在。 如果它不存在,它会自动创建它。 现在,这是我的问题。

messages_`,datereturn

看来我得到错误甚至编译。我们如何传递参数来创建表格?

非常感谢您的帮助。

全码:

BEGIN 
    SET datereturn = (SELECT DATE_FORMAT(NOW(),'%Y%m')); 

    CREATE TABLE IF NOT EXISTS `messages_`,datereturn (
     `mid` bigint(17) NOT NULL, 
     `uid` int(11) NOT NULL, 
     `csid` int(11) NOT NULL, 
     `content` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, 
     `content_type` tinyint(4) NOT NULL, 
     `datecreated` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
     `datecreated1` bigint(13) DEFAULT NULL, 
     PRIMARY KEY (`mid`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    END 

编辑:它不同于提出的答案。 我使用MySQL 5.6动态表。 以上建议的线程不适用于我的版本。 所以,我不知道为什么这是可能的重复。

+0

您是不是要找'CONCAT( “messages_”,datereturn)'? –

+0

@ PM77-1,那么,我试过,我得到这个错误'''你的SQL语法有错误;检查与您的MySQL服务器版本相对应的手册,以便在'datereturn'附近使用正确的语法('mid' bigint(17)NOT NULL,'uid' int(11)NOT NULL,'csid'at line 4''' – FreedomPride

+0

[mysql(5.1)>使用变量名称创建表的可能的副本](http://stackoverflow.com/questions/7489142/mysql-5-1-create-table-with-name-from-a-variable ) –

回答

1

存储过程不允许将变量合并到SQL标识符中。换句话说,在查询被解析之前,必须设置诸如表名之类的东西。

所以,你需要创建一个dynamic SQL statement,使存储过程在运行时准备CREATE TABLE语句:

BEGIN 
    SET @sql = CONCAT('CREATE TABLE IF NOT EXISTS messages_',datereturn,' (', 
     'mid bigint NOT NULL, ', 
     'uid int NOT NULL, ', 
     'csid int NOT NULL, ', 
     'content varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, ', 
     'content_type tinyint NOT NULL, ', 
     'datecreated timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, ', 
     'datecreated1 bigint DEFAULT NULL, ', 
     'PRIMARY KEY (mid)', 
    ') ENGINE=InnoDB DEFAULT CHARSET=latin1'); 

    PREPARE stmt FROM @sql; 
    EXECUTE stmt; 
    DEALLOCATE PREPARE stmt;  
END 

(注:我没有测试此代码,所以如果我错过了报价,我希望你知道如何解决这个问题。)

在这个例子中,我还删除了back-ticks,因为它们不是必需的,我删除了int类型的长度选项,因为它们没有效果。

所有这一切说,我不得不质疑为什么你需要每个日期的表。看起来像一个代码味道给我。你有没有考虑过creating a table partitioned by date

+0

比尔,你是一个救世主,我需要将这个参数返回给服务器,所以插入方法将以日期为基础,那是我第一次听到按日期分区的表格,米看着它。 – FreedomPride

0
SET @CrtTbl = CONCAT('CREATE TABLE', CONCAT('`messages_', datererun), '(mid bigint(17) NOT NULL, .... and so on 

... 

PREPARE CrtTblStmt FROM @CrtTbl; 
EXECUTE CrtTblStmt; 
DEALLOCATE PREPARE CrtTblStmt; 

类似的东西