我面临一个动态创建表名的小问题。
例如,此查询(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制作动态表。上面建议的线程对我的版本不起作用。所以,我不知道为什么会有重复。
发布于 2017-02-10 02:56:03
存储过程不允许将变量组合到SQL标识符中。换句话说,必须在解析查询之前设置诸如表名之类的内容。
因此,您需要创建一个动态SQL语句并使存储过程在运行时准备create语句:
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类型的长度选项,因为它们没有效果。
不过,我得问你为什么每次约会都需要一张桌子。在我看来像是暗号味。你考虑过创建按日期分区的表吗?
发布于 2017-02-10 03:01:20
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;类似这样的东西
https://stackoverflow.com/questions/42150587
复制相似问题