gpt4 book ai didi

从数据库删除时出现 MySQL Date_Sub 问题(使用变量)

转载 作者:行者123 更新时间:2023-11-30 01:16:06 25 4
gpt4 key购买 nike

我正在尝试将选择查询的结果保存到文件中,然后截断该数据库表。对于备份,我运行一个查询,该查询使用 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:如果有更好的方法,那么我洗耳恭听......目前这些语句正在这样的 block 内运行......

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

最佳答案

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

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 放入脚本中,它将在执行之前显示该行,并替换变量。您可以看到变量是否有问题。

关于从数据库删除时出现 MySQL Date_Sub 问题(使用变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19040532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com