在Linux CMD系列中,如何以YYYY-MM-DD格式添加今天的MySQL表名。例如,如果今天的日期是4/13/18,则会将tablename更改为tablename-2018-04-13。
我相信自从我从命令行输入mysql后尝试过的时候我已经接近了:
ALTER TABLE database.tablename RENAME database.tablename-$(date +%Y-%m-%d);
这会产生错误:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near '-$(date +%Y-%m-%d)' at line 1
答案 0 :(得分:0)
set @sql = CONCAT('RENAME TABLE `tablename` TO tablename', DATE_FORMAT(CURRENT_DATE - INTERVAL 1 MONTH, '%Y_%m_%d'));
prepare s from @sql;
execute s;
根据@ Anthony的评论更新。 sql命令已经过测试;
答案 1 :(得分:0)
您似乎在MySQL客户端中使用bash命令替换。这不起作用,因为SQL不知道像$()
这样的bash语法。
另一个问题是您必须使用标识符,而不是字符串。表的名称不能是表达式,必须在解析之前在ALTER语句中修复它。
您可以使用PREPARE和EXECUTE执行此操作:
mysql> SET @sql = CONCAT('ALTER TABLE database.tablename RENAME database.tablename_', DATE_FORMAT(CURDATE(), '%Y%m%d'));
mysql> PREPARE stmt FROM @sql;
mysql> EXECUTE stmt;
注意我更改了您的表名,因为-
是SQL标识符中的特殊字符。您通常不能使用具有-
个字符的表名。如果您将表名放在分隔符中,则可以。 MySQL的分隔符是后退的。
mysql> SET @sql = CONCAT('ALTER TABLE database.tablename RENAME database.`tablename-', DATE_FORMAT(CURDATE(), '%Y-%m-%d'), '`');
然后像以前一样准备和执行。
但这是不必要的复杂,每次你想在查询中使用这个表时,你需要记住使用反向标记。
避免在表名中使用特殊字符要简单得多。
答案 2 :(得分:0)
所有的答案和评论都让我得到了最适合我的答案。我放弃了-YYYY-MM-DD追加约定,因为除了创建问题之外它对我没有任何帮助,正如@Bill_Karwin上面所强调的那样。这是简单的BASH命令,非常类似于@Anthony上面的评论,对我有用:
mysql database -e "ALTER TABLE table RENAME table_$(date +%Y%m%d)";
这会将表重命名为(假设例如,如果在4/15/18上运行)table_20180415。