2017-02-10 41 views
1

我正面臨一個動態創建表名的問題。MYSQL存儲過程從日期創建動態表

例如, 該查詢返回(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

您是不是要找'CONCAT( 「messages_」,datereturn)'? –

+0

@ PM77-1,那麼,我試過,我得到這個錯誤'''你的SQL語法有錯誤;檢查與您的MySQL服務器版本相對應的手冊,以便在'datereturn'附近使用正確的語法('mid' bigint(17)NOT NULL,'uid' int(11)NOT NULL,'csid'at line 4''' – FreedomPride

+0

[mysql(5.1)>使用變量名稱創建表的可能的副本](http://stackoverflow.com/questions/7489142/mysql-5-1-create-table-with-name-from-a-variable ) –

回答

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 

(注:我沒有測試此代碼,所以如果我錯過了報價,我希望你知道如何解決這個問題。)

在這個例子中,我還刪除了back-ticks,因爲它們不是必需的,我刪除了int類型的長度選項,因爲它們沒有效果。

所有這一切說,我不得不質疑爲什麼你需要每個日期的表。看起來像一個代碼味道給我。你有沒有考慮過creating a table partitioned by date

+0

比爾,你是一個救世主,我需要將這個參數返回給服務器,所以插入方法將以日期爲基礎,那是我第一次聽到按日期分區的表格,米看着它。 – FreedomPride

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; 

類似的東西