6

HDD上の実際のファイルへの相対パスを保持するテーブルがあります。例えば:

SELECT * FROM images -->
id | path
1  | /files/1.jpg
2  | /files/2.jpg

存在しないファイルを指すすべてのレコードを選択するクエリを作成できますか? PHPクライアントで反復を使用せずに、MySqlサーバーで正確にチェックする必要があります。

4

4 に答える 4

4

MySQLLOAD_FILEコマンドには、開くことができるファイルに関する非常に厳しい要件があります。MySQL ドキュメントから:

[ LOAD_FILE] ファイルを読み取り、ファイルの内容を文字列として返します。この関数を使用するには、ファイルがサーバー ホストに配置されている必要があり、ファイルへのフル パス名を指定し、FILE 権限を持っている必要があります。ファイルは全員が読み取り可能で、そのサイズは max_allowed_pa​​cket バイト未満でなければなりません。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ます。

于 2015-06-29T22:20:35.360 に答える
2

MYSQL はデータベースのみを処理するため、ファイルが存在するかどうかを確認するために SQL ステートメントを起動する方法はありません。行を繰り返し処理し、PHP で確認する必要があります。

于 2013-06-19T13:45:52.033 に答える
0

ストックMySQLを使用することはできません。ただし、おそらく C でUDF (ユーザー定義関数) を記述し、 CREATE FUNCTIONステートメントを使用してそれをロードし、組み込み関数を使用する場合と同様に MySQL から使用することができます。

于 2013-11-11T16:58:10.917 に答える