2016-03-26 60 views
0

有沒有辦法將列的名稱更改爲當前日期?我不需要它隨着日期變化而動態更新 - 只是執行代碼的日期。我想下面的代碼卻得到了一個語法錯誤用MySQL中的當前日期重命名一列

ALTER TABLE table_name CHANGE old_column_name CURDATE() DATE; 
+2

不可以,但你爲什麼要說出這樣的一列?如果你認爲你需要這樣做,那麼你的數據庫設計是非常有缺陷的。這是一個[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。如果您要爲單獨的日期添加列,那麼您的模式已破碎,SuperGlue無法修復它。 –

+1

請勿違反正確[數據庫規範化](http://en.wikipedia.org/wiki/Database_normalization)中的[Zero,One或Infinity規則](http://en.wikipedia.org/wiki/Zero_one_infinity_rule) 。這是一個超級壞主意。 – tadman

+1

對於這樣的列名,你會期望什麼格式?也許是「2016年3月26日星期六」或「2016/03/26」,該列的數據類型是什麼?當然不是日期時間。你能想象2016/3/26的專欄中出現了其他日期的混淆。或者想像這樣的查詢的混淆從table_name'2016/03/26'> ='2016-03-26'選擇'2016/03/26'。這是一個荒謬的想法。 –

回答

1

在ALTER TABLE語句,新列的名稱必須像SQL文本的任何其他標識符供應。

列的新名稱不能作爲函數的返回或作爲綁定佔位符提供。它必須作爲標識符提供。

也就是說,您提交到數據庫的SQL語句,需要有新的列名實際上拼出來,作爲語句的一部分:

ALTER TABLE table_name CHANGE old_column_name new_column_name DATE 

所以,簡單的回答你的問題是沒有,它不能在單個SQL語句中完成。


很明顯,你可以在單獨的步驟進行操作,以獲得當前的日期,並創建要執行一個包含字符串的SQL語句。看起來您似乎也需要確定要更改的列的當前名稱。


除此之外,被問的問題...

我有困難fathoming一個使用情況下是這樣的將是一個合適的解決方案。 什麼問題是這種類型的功能試圖解決?爲什麼你需要更改列的名稱。任何引用列的SQL語句也需要更改。你能否將這個「日期」作爲存儲在另一個表的一行中?

我唯一能想到的是,爲什麼有人會想要這樣做會被誤導,試圖在SELECT *查詢的結果集中指定一個列名。

0

雖然它可能是一個壞主意,你要做的 - 它可以通過使用prepared statement

SET @stmt := CONCAT('ALTER TABLE table_name CHANGE old_column_name `', CURDATE(), '` DATE;'); 
PREPARE stmt from @stmt; 
EXECUTE stmt; 
相關問題