2014-09-28 66 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的表。