首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL存储过程从日期创建动态表

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

Stack Overflow用户
提问于 2017-02-10 02:39:49
回答 2查看 1.6K关注 0票数 1

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

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

我的动机是检查这张桌子是否存在。如果它不存在,它将自动创建它。现在我的问题是。

messages_`,datereturn

看来我甚至编译都会出错。如何传递参数来创建表?

真的很感谢你的帮助。

完整法典:

代码语言:javascript
复制
   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制作动态表。上面建议的线程对我的版本不起作用。所以,我不知道为什么会有重复。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-10 02:56:03

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

因此,您需要创建一个动态SQL语句并使存储过程在运行时准备create语句:

代码语言:javascript
复制
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类型的长度选项,因为它们没有效果。

不过,我得问你为什么每次约会都需要一张桌子。在我看来像是暗号味。你考虑过创建按日期分区的表吗?

票数 1
EN

Stack Overflow用户

发布于 2017-02-10 03:01:20

代码语言:javascript
复制
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;

类似这样的东西

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42150587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档