2016-03-26 27 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; 
相关问题