我有一个表,其中包含HDD上实际文件的相对路径.例如:
SELECT * FROM images -->
id | path
1 | /files/1.jpg
2 | /files/2.jpg
Run Code Online (Sandbox Code Playgroud)
我可以创建一个查询来选择指向不存在的文件的所有记录吗?我需要完全通过MySql服务器检查它,而不使用PHP客户端中的迭代.
Mat*_*ari 10
我会使用这样的查询:
SELECT id, path, ISNULL(LOAD_FILE(path)) as not_exists
FROM images
HAVING not_exists = 1
Run Code Online (Sandbox Code Playgroud)
该函数LOAD_FILE尝试将文件作为字符串加载,并NULL在失败时返回.
请注意,在这种情况下失败的原因可能是mysql根本无法读取该特定位置,即使该文件确实存在.
编辑:
正如@ostrokach在评论中指出的那样,这不是标准的SQL,即使MySQL允许它,也可以遵循标准:
SELECT *
FROM images
WHERE LOAD_FILE(PATH) IS NULL
Run Code Online (Sandbox Code Playgroud)
MySQLLOAD_FILE命令对其可以打开的文件有非常严格的要求。来自 MySQL 文档:
[
LOAD_FILE] 读取文件并以字符串形式返回文件内容。要使用此功能,文件必须位于服务器主机上,必须指定文件的完整路径名,并且必须具有 FILE 权限。该文件必须可供所有人读取,并且其大小小于 max_allowed_packet 字节。如果 secure_file_priv 系统变量设置为非空目录名,则要加载的文件必须位于该目录中。
因此,如果用户无法访问该文件mysql或任何其他要求不满足,LOAD_FILE将返回Null.
您可以使用以下命令获取与丢失文件相对应的 ID 列表awk:
mysql db_name --batch -s -e“从图像中选择id,路径”\
| awk '{if(system("[ -e " $2 " ]") == 1) {print $1}}' \
>> 缺失_ids.txt
或者简单地使用bash:
mysql db_name --batch -s -e“从图像中选择id,路径”\
| 同时读取 id 路径;如果 [[ -e "$path" ]] ; 然后回显 $id ;完毕
>> 缺失_ids.txt
这还有一个优点,就是比LOAD_FILE.
| 归档时间: |
|
| 查看次数: |
10307 次 |
| 最近记录: |