HDD上の実際のファイルへの相対パスを保持するテーブルがあります。例えば:
SELECT * FROM images -->
id | path
1 | /files/1.jpg
2 | /files/2.jpg
存在しないファイルを指すすべてのレコードを選択するクエリを作成できますか? PHPクライアントで反復を使用せずに、MySqlサーバーで正確にチェックする必要があります。
HDD上の実際のファイルへの相対パスを保持するテーブルがあります。例えば:
SELECT * FROM images -->
id | path
1 | /files/1.jpg
2 | /files/2.jpg
存在しないファイルを指すすべてのレコードを選択するクエリを作成できますか? PHPクライアントで反復を使用せずに、MySqlサーバーで正確にチェックする必要があります。
MySQLLOAD_FILE
コマンドには、開くことができるファイルに関する非常に厳しい要件があります。MySQL ドキュメントから:
[
LOAD_FILE
] ファイルを読み取り、ファイルの内容を文字列として返します。この関数を使用するには、ファイルがサーバー ホストに配置されている必要があり、ファイルへのフル パス名を指定し、FILE 権限を持っている必要があります。ファイルは全員が読み取り可能で、そのサイズは max_allowed_packet バイト未満でなければなりません。secure_file_priv システム変数が空でないディレクトリ名に設定されている場合、ロードするファイルはそのディレクトリにある必要があります。
そのため、ユーザーがファイルにアクセスできない場合、mysql
または他の要件のいずれかが満たされていない場合、LOAD_FILE
は を返しNull
ます。
次を使用して、不足しているファイルに対応する ID のリストを取得できますawk
。
mysql db_name --batch -s -e "SELECT ID, path FROM images" \ | | awk '{if(system("[ -e " $2 " ]") == 1) {print $1}}' \ >> missing_ids.txt
または単に使用するbash
:
mysql db_name --batch -s -e "SELECT ID, path FROM images" \ | | idパスを読みながら; [[ -e "$パス" ]] の場合。次に $id をエコーします。終わり >> missing_ids.txt
これには、 よりもはるかに高速であるという利点もありLOAD_FILE
ます。
MYSQL はデータベースのみを処理するため、ファイルが存在するかどうかを確認するために SQL ステートメントを起動する方法はありません。行を繰り返し処理し、PHP で確認する必要があります。
ストックMySQLを使用することはできません。ただし、おそらく C でUDF (ユーザー定義関数) を記述し、 CREATE FUNCTIONステートメントを使用してそれをロードし、組み込み関数を使用する場合と同様に MySQL から使用することができます。