2016-05-28 6 views
0

私はSQLを初めて使っていますが、各挿入時に実行される簡単なトリガーを構築しようとしています。キーがすでに存在する場合はテーブルの値を更新し、存在しない場合は新しい値を挿入します。キーが存在する場合、または挿入ifが存在しない場合、MariaDB SQLトリガを更新しますか?

以下は私が試みたことですが、私は理想的には、テスターを挿入したいものにしたいと思っています。 NEW.reference_keyのようなもの?

CREATE TRIGGER key_access_monitor 
BEFORE INSERT ON individual_key_log 
FOR EACH ROW 
BEGIN 
    IF EXISTS (SELECT reference_key FROM individual_key_log WHERE key = 'tester') 
     SELECT 'Found it!' 
    ELSE 
    SELECT 'Cannot find it!' 
    END IF 
END 

答えて

0

同じキーを持つ行が存在しない場合は新しい行を挿入し、存在する場合は既存の行を更新しますが、正しいのですか?

あなたは、おそらく次のようにそれが簡単に、INSERT ... ON DUPLICATE KEY UPDATEを使用することを見つけるだろう:

INSERT INTO individual_key_log 
    (key, col1, col2, col3, ...) 
    VALUES 
    ('tester', 'val1', 'val2', 'val3', ...) 
    ON DUPLICATE KEY UPDATE 
    SET col1 = 'val1', col2 = 'val2', col3 = 'val3', ...; 

あなたのトリガアプローチの問題点の一つは、行トリガー内からテーブルを照会しようとする悪い習慣であるということですその同じテーブルには、それがACIDの原則に違反するので、多くのDBMSはそれをまったく許可しないため、 "Mutating Table"エラーが発生します。 挿入行トリガー内から行を更新すると、同じ問題が拡大されます。行トリガーは、直接的にターゲット表に直接アクセスするのではなく、間接的にトリガー行にアクセスするのではなく、間接的にOLDおよびNEWを介してアクセスしてください。

希望に役立ちます。

+0

これはかなり良いです、唯一の問題は私が取得していますストアドファンクション/トリガーでテーブル 'individual_key_log'を更新できません。このストアドファンクション/トリガーを呼び出すステートメントで既に使用されているためです。 –

+0

私はトリガの代わりに 'INSERT ... ON DUPLICATE KEY UPDATE' *を実行します。それは実際の** INSERT' **クエリ自体でなければなりません。 –

+0

ああ、もちろん。それは理にかなっている。入力いただきありがとうございます! –

関連する問題