5

次の条件のためにSQLiteトリガーを準備する必要があります-

  1. リテールストア、卸売ストア、製品の 3 つのテーブルがあります。
  2. テーブル Retail_store と wholesale_store には、テーブル product の列 product_id があります。

ここで、製品が Retail_store から削除され、それがテーブル wholesale_store にない場合、その製品レコードを製品テーブルから削除するように、削除トリガーを作成したいと考えています。

** このように製品レコードを削除するのは、良い考えではないかもしれません。この質問は、技術的な問題としてのみ受け止めてください。

ご検討いただきありがとうございます。乾杯!

4

3 に答える 3

9

次の sql ステートメントは役に立つかもしれませんが、構文が正しいかどうかは保証できません。

 CREATE TRIGGER after_retail_store_delete after delete ON retail_store
    WHEN ((select count() from  wholesale_store where productid = OLD.id) = 0)
    BEGIN
      DELETE FROM product WHERE productid = OLD.id ;
    END ;
于 2012-05-24T16:49:13.573 に答える
1

実際にはトリガーは必要ないようです。カスケード削除の利用を検討します。外部キーを使用していますか? これをチェックしてください:

SQLite データベースの各外部キーに関連付けられた ON DELETE および ON UPDATE アクションは、「NO ACTION」、「RESTRICT」、「SET NULL」、「SET DEFAULT」、または「CASCADE」のいずれかです。アクションが明示的に指定されていない場合、デフォルトは「NO ACTION」です。

NO ACTION: 「NO ACTION」を構成すると、親キーが変更されたり、データベースから削除されたりしても、特別なアクションは実行されません。

RESTRICT: 「RESTRICT」アクションは、1 つ以上の子キーにマップされている場合に、アプリケーションが親キーを削除 (ON DELETE RESTRICT の場合) または変更 (ON UPDATE RESTRICT の場合) することを禁止することを意味します。RESTRICT アクションの効果と通常の外部キー制約の強制の違いは、フィールドが更新されるとすぐに RESTRICT アクションの処理が行われることです。即時制約の場合のように現在のステートメントの最後ではなく、最後に実行されます。遅延制約の場合と同様に、現在のトランザクションの。アタッチされている外部キー制約が延期されている場合でも、RESTRICT アクションを構成すると、依存する子キーを持つ親キーが削除または変更されると、SQLite はすぐにエラーを返します。

SET NULL: 構成されたアクションが「SET NULL」の場合、親キーが削除(ON DELETE SET NULLの場合)または変更(ON UPDATE SET NULLの場合)されると、マップされた子表のすべての行の子キー列親キーへの値は SQL NULL 値を含むように設定されています。

SET DEFAULT: 「SET DEFAULT」アクションは「SET NULL」に似ていますが、各子キー列が NULL ではなく列のデフォルト値を含むように設定されている点が異なります。テーブル列にデフォルト値を割り当てる方法の詳細については、CREATE TABLE のドキュメントを参照してください。

CASCADE: 「CASCADE」アクションは、親キーに対する削除または更新操作を各従属子キーに伝播します。「ON DELETE CASCADE」アクションの場合、これは、削除された親行に関連付けられていた子テーブルの各行も削除されることを意味します。「ON UPDATE CASCADE」アクションの場合、依存する各子キーに格納されている値が、新しい親キーの値と一致するように変更されることを意味します。

詳細はこちら: http://www.sqlite.org/foreignkeys.html#fk_actions

于 2012-05-24T16:21:42.430 に答える