如何以今天的格式附加MySQL表名称" -YYYY-MM-DD"与BASH

时间:2018-04-13 23:47:40

标签: mysql linux shell command-line

在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

3 个答案:

答案 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。