0

選択クエリの結果をファイルに保存してから、そのデータベース テーブルを切り捨てようとしています。バックアップの場合、シェル変数を使用してバックアップが必要な日数を決定するクエリを実行すると、正常に機能し、ファイルが保存され、希望どおりに機能します。

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 の値は、シェル スクリプト (ユーザー入力) から取得されます。その部分が機能するようにわかりました。

古いエントリを削除するために同じ行で何かをしようとすると、うまくいきません..

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 シェルに入る前に両方の変数の値をエコーし​​ようとしました..

さらに私も試しました

Set @daysret1=$daysret;
SELECT @daysret1 ;

そして、daysret1 の正しい値を取得し、daysret の値も正しいことを示します。また、クエリで @daysret1 を直接使用しようとしましたが、それでも役に立ちませんでした。二重引用符のさまざまなバリエーションと、そのdeleteステートメントにないものを試しましたが、うまくいきません。数値を直接 (変数なしで) 使用すると正常に動作するため、コマンドは適切であり、変数自体と関係があります。

また、構文エラーがある場合、MySql は実際にエラーを表示します (そのクエリで引用符やコンマなどをいじっているときにエラーのいくつかに遭遇しました) が、上に投稿したコマンドでは何も起こらず、スクリプトがハングし、データベースからは何も削除されません。

助けてください!

PS: それを行うより良い方法があれば、私はすべて耳にします..現在、これらのステートメントはこのようなブロック内で実行されています..

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

1 に答える 1

0

使用する必要はありません。CONCATまたはPREPARE、2 番目のケースでは、単純に次のようにすることができます。

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

ただし、クエリは機能するはずです。条件に一致する行がありますWHEREか? 2 つのクエリで異なるシェル変数を使用してい$daysbackます$daysret。したがって、最初の行が返されたからといって、2 番目の行が削除するものを見つけるとは限りません。

別の書き方は次のとおりです。

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 に答える