0

我正在尝试将选择查询的结果保存到文件中,然后截断该数据库表。对于备份,我运行一个查询,该查询使用一个 shell 变量来确定我需要备份多少天,它工作正常,我保存了一个文件,完全按照我的意愿工作。

SET @sql_text = CONCAT ( "SELECT * FROM databasename.tablename WHERE (datetimestamp < (NOW()) AND datetimestamp > (DATE_SUB(NOW(),INTERVAL ",$daysback," DAY))) into outfile 'filename-" , DATE_FORMAT( NOW(), '%Y%m%d%H%i') , ".csv'" , "FIELDS TERMINATED BY ',' " , "LINES TERMINATED BY '\n' ");
PREPARE s1 FROM @sql_text;
EXECUTE s1;
DROP PREPARE s1;

daysback 的值来自 shell 脚本(用户输入)。好的,所以这部分工作。

现在,当我尝试在同一行上执行某些操作以删除旧条目时,它就是行不通..

SET @sql_text = CONCAT("DELETE FROM databasename.tablename WHERE datetimestamp < DATE_SUB(NOW(), INTERVAL ",$daysret," DAY)");
PREPARE s1 FROM @sql_text;
EXECUTE s1;
DROP PREPARE s1;

再次,这里的变量 daysret 来自脚本并且值是正确的,我敢肯定,在进入 MySQl shell 之前尝试回显两个变量的值..

此外,我也尝试过

Set @daysret1=$daysret;
SELECT @daysret1 ;

我得到了 daysret1 的正确值,表明 daysret 的值也是正确的。还尝试直接在查询中使用@daysret1,但即使这样也无济于事。我尝试了双引号的各种变体以及该删除语句中没有的内容,但它只是无法完成它的工作。如果我直接使用数字(无变量),效果很好,所以命令很好,它只是与变量本身有关。

此外,如果存在语法错误,那么 MySql 实际上会显示错误(在该查询中使用引号、逗号等时遇到了一些错误),但是在我上面发布的命令中,没有任何反应,脚本挂起,并且不会从数据库中删除任何内容。

请帮忙!

PS:如果有更好的方法,那么我会全神贯注..目前这些语句正在这样的块内运行..

mysql -u$user -p$pass << EOF
....
....
EOF
4

1 回答 1

0

您不需要使用CONCAT,或者PREPARE在第二种情况下,它可以很简单:

mysql -u$user -p$pass <<EOF
DELETE FROM tablename
WHERE datetimestamp < DATE_SUB(NOW(), INTERVAL $daysret DAY)
EOF

但是,在我看来,您的查询应该可以工作。您确定有符合WHERE条件的行吗?您在两个查询中使用了不同的 shell 变量:第一个使用$daysback,第二个使用$daysret。所以仅仅因为第一个返回行并不意味着第二个会找到要删除的东西。

另一种写法是:

mysql -u$user -p$pass -e "DELETE FROM tablename WHERE datetimestamp < DATE_SUB(NOW(), INTERVAL $daysret DAY)"

这样做的一个优点是您可以放入set -x脚本,它会在执行之前显示该行,并替换变量。你可以看看变量是否有问题。

于 2013-09-27T00:12:42.080 回答