MySQL INTO OUTFILE 覆盖现有文件?

2022-08-30 10:02:40

我写了一个大的sql脚本来创建一个CSV文件。我想每天晚上打电话给cronjob,创建一个新的CSV文件,并在网站上提供。

例如,假设我将文件存储在“/home/sites/example.com/www/files/backup.csv”中。

而我的 SQL 是

SELECT * INTO OUTFILE '/home/sites/example.com/www/files/backup.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM ( ....

MySQL在文件已经存在时给我一个错误

文件“/home/sites/example.com/www/files/backup.csv”已存在

有没有办法让MySQL覆盖文件?

我可以让PHP检测文件是否存在,并在再次创建之前将其删除,但如果我可以直接在MySQL中执行此操作,它将更加简洁。


答案 1

不,没有办法覆盖它。从文档中

file_name不能是现有文件,这除其他外,可以防止 /etc/passwd 和数据库表等文件被销毁。

每晚使用不同的文件名可能是一个更好的主意,因为拥有多个备份意味着您可以从存在超过一天的问题中恢复。然后,您可以维护一个符号链接,该符号链接始终指向最新的完整 csv。


答案 2

为什么不在cron运行的脚本中?rm -f /home/sites/example.com/www/files/backup.csv

您可以从mysql内部运行它。只需逃逸到 shell 例如:\!

Mysql> \! rm -f /home/sites/example.com/www/files/backup.csv


推荐