我正在尝试将select查询的结果保存到文件中,然后截断该数据库表。 对于备份,我运行一个查询,该查询使用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
答案 0 :(得分: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
,它会在执行之前显示该行,并替换变量。你可以看到变量是否存在问题。