2016-12-19 28 views
0

我必須將alter命令添加到我的架構。更改架構不起作用

SET @s = (SELECT IF(
    (SELECT COUNT(*) 
     FROM INFORMATION_SCHEMA.COLUMNS 
     WHERE table_name = 'product' 
     AND table_schema = DATABASE() 
    AND column_name = 'date_madified' 
    ) > 0, 
    "SELECT 1;", 
    "ALTER TABLE `product` CHANGE `date_madified` `date_modified`;" 
)); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 
DEALLOCATE PREPARE stmt; 

以上執行過程中沒有發生錯誤。但列名不會改變。 當我試圖檢查我發現的錯誤的原因。 1.正確的數據庫沒有被選中。 2.'IF'沒有得到正確的結果,即使我硬編碼數據庫名稱。

儘管以上格式的sql對所有其他修改名稱,數據類型和大小等的情況都能夠成功執行,但在這種情況下,它無法正常工作。

+0

我確定有些列可能已經瘋了,但mysql很幸福地意識到它。您應該查找'date_modified'而不是 – e4c5

+0

實際上,列名稱存在拼寫錯誤。這個ALTER模式是糾正錯誤。 –

回答

0

很顯然,在測試數據不在生產環境中嘗試以下內容。

看起來你有你的IF語句錯誤的方式,所以只有當你找到你想修改的字段時才執行select 1;。您需要更改IF語句中的子句順序。

而且ALTER TABLE語句需要列定義,你的情況是這樣

ALTER TABLE `product` CHANGE `date_madified` `date_modified` timestamp 

更改上述以反映date_madified字段的字段類型。

+0

我不能按照最簡單的方式寫ALTER TABLE'product' CHANGE'date_madified''date_modified' DATETIME NULL;我必須按照提及的方式。此外,這種格式在所有其他truncate sql的開發環境中工作。 –