MYSQL存储过程从日期创建动态表

时间:2017-02-10 02:39:50

标签: mysql stored-procedures

我面临一个动态创建表名的问题。

例如, 此查询(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使表格动态化。 以上建议的帖子对我的版本不起作用。 所以,我不知道为什么它可能会重复。

2 个答案:

答案 0 :(得分: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

(注意:我没有测试过这段代码,所以如果我错过了一个引用,我希望你知道如何修复它。)

在这个例子中,我也删除了你的后退,因为它们没有必要,我删除了int类型的长度选项,因为它们没有效果。

所有这一切,我不得不质疑你为什么每个日期需要一张桌子。好像给我一个代码味道。您是否考虑过creating a table partitioned by date

答案 1 :(得分: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;

类似的东西