2014-09-28 26 views
0

我正在构建一个MySQL事件,在名称中使用timestamp制作数据库中表的副本。如何使用select在MySQL中创建表名?

CREATE TABLE `db_name`.`tbl_prefix_(SELECT TO_SECONDS(NOW()))` ([the rest...] 

很明显,这是行不通的。我应该怎么做才能使它工作?

欢迎任何建议。

谢谢

+4

这听起来像是一个非常糟糕的主意,即使是僵尸 – Strawberry 2014-09-28 22:38:55

+1

你可能想看看日期而不是日期的MySQL分区。 – Prix 2014-09-28 22:40:03

+0

我不明白为什么这可能会做任何事情比在单个表中添加时间戳字段 – Brewal 2014-09-28 22:41:42

回答

0

为了做到这一点,您需要使用“动态SQL”。也就是说,使用MySQL PREPARE声明。

你需要做的就是填充变量字符串包含要执行的SQL文本。将变量替换为字符串很简单。

“诀窍”是采取该动态字符串并执行它,就像它是一个SQL语句。

这就是PREPARE语句为我们所做的事情,它接受一个变量并读取该变量的内容,就像它是一条SQL语句。


虽这么说,而不是给演示对此进行了更详细的示例代码中,我会建议你重新考虑这个想法创造与时间戳值的表作为名称的一部分。

什么问题是专为解决?并仔细考虑提出的解决方案设计是否会引入比解决问题更大的问题。

+0

答案的主题是因为这个人甚至没有使用预先准备好的语句 - 他试图创建表来存储各个时间戳。他对数据库工作方式的误解远比你给他信任的方式更重要。 – joshstrike 2014-09-28 23:03:17

+1

@joshstrike:我完全有可能过分慷慨地记录OP对数据库工作方式的理解。 OP暗示他正在创建MySQL'EVENT'对象;很明显OP已经有了CREATE TABLE语句。问题是如何从SELECT中获得结果成为DDL语句中标识符的一部分。 MySQL'PREPARE'语句不仅仅用于“准备好的”DML语句;它也可以用来执行一些DDL语句(只有一些,因为有一些DDL语句无法执行),但我相信CREATE TABLE是受支持的。 – spencer7593 2014-09-28 23:22:37

+0

够公平的,可能乍看起来它只是作为一种备份方法而荒谬......好吧,像这样在飞行中创建表格似乎仍然很疯狂,并且它让我害怕想到任何可以这样工作的东西,尤其是使用名称基于unix时间戳。如果明天我死了,我喜欢编写不会自食其果的软件。有人应该将他指向cron任务和mysqldump。用奇怪的名字填充数据库本身是一个可怕的备份策略。 – joshstrike 2014-09-29 00:58:56

1

这是一个糟糕的体系结构。动态生成表格不是你应该做的事情。

而是使用时间戳列创建单个表。例如,如果您之前有3个包含三个时间戳A,B和C的表,则您现在有一个时间戳列分别包含值A,B和C的表。

相关问题