2

タスクを実行すると、テーブルに 2 つの行が挿入されます。複製。After Insert トリガーを使用して重複を削除する必要があります。それらの2つから1つの重複レコードを削除する必要があります。このようなものが必要です

CREATE TRIGGER del_rec
INSERT ON table1
AFTER(EXECUTE PROCEDURE del_proc());

CREATE PROCEDURE del_proc()

//check field a,b,c of this table already exists for this id. if yes delete the second one

END PROCEDURE;

例えば:

table 1:

a b c d e
1 1 1 2 2
1 1 1 2 2

2行目を削除する必要があります。

4

2 に答える 2

1

SELECT UNIQUE重複する値の挿入を回避したり、テーブルにすでに存在する重複した値を削除したりするために使用しないのはなぜですか?

于 2012-10-19T22:21:02.487 に答える
1

テーブルに重複を挿入できる場合、テーブルの設計が間違っています。それが起こらないことを保証する一意の制約が必要です。

何らかの理由でテーブルを修正できないと仮定すると、次のようになります。

CREATE TRIGGER ins_table1
    INSERT ON table1 REFERENCING NEW AS new
    FOR EACH ROW (EXECUTE PROCEDURE ins_table1(new.a, new.b, new.c));

これは、行を一意に識別するには列と列aで十分であるbと想定しています。cトリガーと手順の名前を変更して、関連する内容とタイミングをより正確に反映させました。delon と呼ばれるものの接頭辞としてはあまり適切ではありませんINSERT

CREATE PROCEDURE ins_table1(new_a INTEGER, new_b INTEGER, new_c INTEGER)

    DEFINE l_a LIKE table1.a;

    FOREACH SELECT a INTO l_a
              FROM table1
             WHERE a = new_a AND b = new_b AND c = new_c
       RAISE EXCEPTION -271, -100;
    END FOREACH;

END PROCEDURE;

これは、挿入される行ごとに呼び出されます。SELECT ステートメントが行を返す場合、FOREACH ループの本体に入るため、例外が発生し、INSERT は多かれ少なかれ適切なエラー (-271 Could not insert new row into the table; - 100 ISAM エラー: 一意のキーを持つレコードの値が重複しています)。

AFTER トリガーを使用してこの検証を実行しようとすると、挿入された単一のキーの組み合わせだけをターゲットにするのではなく、テーブル全体をスキャンして重複がないかどうかを確認する必要があります。一般に、INSERT は複数の行を持つことができることに注意してください (考えてみてくださいINSERT INTO Table SELECT * FROM SomeWhereElse)。パフォーマンスの違いは劇的です!(AFTER トリガーのクエリは、次のようにする必要がありますSELECT a, b, c FROM table1 GROUP BY a, b, c HAVING COUNT(*) > 1。)

于 2012-10-19T20:36:37.780 に答える