2016-07-03 9 views
0

最近、InnoDBで外部キーと削除カスケードの驚異を発見しました。これは、迷惑メールを残すことを心配することなく、複雑なデータ構造を簡単に削除するのに役立ちます。私は現在、次のように(あなたがウェブショップ上でなければなりませんように)製品データベースの画像を保存してい関連する画像ファイルの削除に対するデータベースレコードのカスケード削除

productsの表は、あなたが期待するものです、それはid主要列があります。 私のproduct_imagesテーブルには、products.idカラムへの外部キーを持つproduct_idカラムと、イメージファイル名を格納するタイプvarcharのimageカラムがあります。

ファイル名は、画像のSHA1ハッシュを計算し、ハッシュの最初の2文字の後に名前が付けられたフォルダに保存します。 61/6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.jpg。データベースには、6153A6FA0E4880D9B8D0BE4720F78E895265D0A9.jpgのみが格納されます。

データベースから製品を削除する場合、カスケードDELETEルールはproduct_imagesテーブルのレコードを削除しますが、ファイルは自分のサーバーに残します。

product_imagesテーブル内のレコードが削除されるたびに、イメージファイルの削除を自動化する方法はありますか?具体的に、またはカスケードしてください。削除操作に何らかのトリガーやルーチンがリンクされている可能性がありますか?

+0

は、私はこのような機能は、MySQLに存在しないと思うことができます解除伴うが、解決する方法を聞くのが大好きですこの問題 – akuzminsky

+0

これは、私が 'CASCADE'(またはそのような場合は「FOREIGN KEY」)を使用しないで、アプリケーション内のすべての作業を行うもう一つの理由です。 –

答えて

2

これを実行するためのネイティブ機能は、mysqlに組み込まれていません。もし存在すれば、それをフィーチャークリープ(feature-creep)と完全な吹き飛ばされた高水準プログラミング言語に変えることは、終わりがないだろう。そのコアコンピテンシーから逃げる、ブロートウェア。

人は、CでコンパイルされたUDFライブラリを使用して、mysqlにオブジェクトファイルとして統合するか、サーバソースにコンパイルします。セクションAdding New Functions to MySQLUDF Repository for MySQLを参照してください。それはサイエンスフェアのようなものになります。一度作業すれば、おそらく他のサーバーにそれを公開することは望ましくありません。

あなたはどういう選択肢ですか?安全なベットは、ディレクトリ/ファイル名のコンボを別のテーブル(カスケード削除階層外)に書き込むことです。そして、別のミニシステムであなたのための家事掃除をしてください。たとえば、Javaやc#やPython(任意の言語)で、1日2回。これらの環境には、dbライブラリと強力なファイル操作があります。とにかくそれはずっと簡単です。

私は、ストアドプロシージャとeventsの中で主にファイルベースまたは禁止された呼び出しであるmysql関連アクティビティの機能を拡張するために、これらのタイプの処理を行います。

+0

詳細な回答ありがとうございます。私は、スクリプトを実行したり、ファイルシステムとやりとりすることを可能にする、トリガーにアナログのようなものがあることを期待していました。あまりにも悪い:)あなたが言ったように、私は別のテーブルの削除を記録するトリガを作成し、その後、定期的にそのテーブルをポーリングして削除する必要があるファイルを知ることができると思います。 – beeb

+0

UDFを使用するのは簡単です。それでは、どうすれば簡単に展開できますか?あなたは他の場所にあなたのコードがあると信じているより多くのパワーと幸福を見つけるでしょう。申し訳ありませんが、あなたが望んでいたものではありませんでした(現時点で)。 – Drew

+0

[cron](http://stackoverflow.com/q/21789148)は、タスクを実行するために広く普及しています。 – Drew

0

以下のコードを使用して特定のファイルを削除します。
注:ファイル名($ filName)はクエリのものです。

$filName; 
$dirName = substr($filName, 0, 2); 

chown($filName,465); 
unlink("../".dirName."/" . $filName); 
+0

私はあなたが私の要求を理解したとは思わない。私はサーバー上のファイルを削除する方法を知っていますが、行が私のテーブルから削除された場合(つまりカスケーディングという単語)、この削除を自動的に実行する方法を知りたいと思います。私は何とかMySQLの削除操作にスクリプトをリンクしたい。 – beeb

0

DBに画像を挿入する際には、製品の またはそのカテゴリにリンクする名前を変更してください。 名前を持つ撮像されたため、カテゴリ検索を削除する猫idは、それは

このコードは

 foreach(glob(IMG_PATH.'cat_'.$_POST['id'].'*.*') as $file) 
     { 
      if(is_file($file)) 
      { 
       @unlink($file); 
      } 


    }