sql >> データベース >  >> RDS >> PostgreSQL

実際のテーブルから行を削除する前に、関連するテーブルから行を削除するトリガー

    トリガー機能に関するその他のアドバイス:

    CREATE OR REPLACE FUNCTION delete_question()
      RETURNS trigger AS
    $func$
    BEGIN
    
    CASE OLD.que_type
    WHEN 1 THEN
        DELETE FROM mcq   WHERE que_id=OLD.id;
    WHEN 2, 3 THEN
        DELETE FROM tffb  WHERE que_id=OLD.id;
    WHEN 4 THEN
        DELETE FROM essay WHERE que_id=OLD.id;
    -- ELSE
    --      Do something?
    END CASE;
    
    RETURN OLD;
    
    END
    $func$ LANGUAGE plpgsql;
    

    主なポイント

    • SELECTを使用した存在の確認 ステートメントはコストを2倍にします。 DELETEを実行するだけです 、一致する行が見つからない場合、何も削除されません。

    • CASEを使用する ここに声明。より短く、より速く。 plpgsql CASE SQL CASEとは少し異なります 声明。たとえば、一度に複数のケースを一覧表示できます。

    • DECLAREは必要ありません 実際に変数を宣言しない限り、キーワード。

    代替設計

    カスケード削除により、この問題を完全に回避できます。外部キー経由@a_horseがコメントに記載されています 。私のスキーマレイアウトは次のようになります:

    CREATE TABLE question (
       question_id serial NOT NULL PRIMARY KEY
      ,que_type    int   -- this may be redundant as well
    );
    
    CREATE TABLE essay (
       que_id int NOT NULL PRIMARY KEY
                  REFERNECES question(question_id) ON UPDATE CASCADE
                                                   ON DELETE CASCADE
      ,ans    text
    );
    
    ...
    

    serialについて :
    SQL関数の自動インクリメント



    1. 不足している日付を SQL に追加する方法のクエリ

    2. MySQLWorkbenchでグレー表示された列入力

    3. 行の数値から1を引くSQLクエリ

    4. 単純なmysql++コードがスタンドアロンでコンパイルされるのに、プロジェクトではコンパイルされないのはなぜですか?