我面临一个动态创建表名的问题。
例如,
此查询(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 :(得分: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;
类似的东西