2016-05-02 18 views
1

テーブルuser_infoのu_countの値を使用して、テーブルuser_detailsのカラムuser_countの値を更新できるトリガーを作成しようとしました。トリガー防止レコード挿入

CREATE TRIGGER `test` 
AFTER INSERT ON `user_details` FOR EACH ROW 
BEGIN 
    DECLARE default_user_count int(11); 
    SELECT u_count INTO @default_user_count FROM 
    user_info WHERE user_info.id= user_details.id_c; 
    IF user_details.user_count= 0 
     THEN UPDATE user_details SET 
     user_count = default_user_count 
     WHERE user_details.id_c = user_info.id; 
    END IF; 
END 

トリガが正常に保存されたが、私はuser_detailsにレコードを挿入するために防止され、両方のテーブルに値を挿入しようとしたとき、我々は、その作業をトリガーを削除した場合、2この表に挿入ない行を意味しません。

誰でも私にこのトリガーが間違っていると教えてもらえますか?

おかげで、 M.

+1

このテーブルのトリガー内のテーブルの内容を変更することはできません。 – Uueerdo

+0

トリガーの何が間違っているのかはかなり明らかですが、実際に何をしようとしているのか、そしてなぜそれを理解するのは本当に難しいです。データが1つのテーブルに存在する場合は、通常、後で)結合して...それをコピーすることではありません。 –

+0

@Michael:コアファイルにアクセスできないため、コード内で変更を加えることはできません。それは私がINSERT後にトリガーを作成しようとしていた理由です。 – Maverick

答えて

1

は、それはあなたが達成しようとしているものは本当に明確ではないのですが、それは我々が以下の持っているもののようなものだように思えます。

トリガーには多少の間違いやあいまいさがあります。

  • 変数の混乱 - DECLARE default_user_count INT(11);は、ユーザー定義@default_user_count変数を宣言しません。プログラム変数default_user_countを宣言します。 @という接頭辞は、全く異なる変数スコープと名前空間を参照します。トリガーを起動テーブルから

  • SELECTUPDATEは、通常、意味をなす(SELECT)または(UPDATE)完全に無効でありません。

  • トリガーでは、FOR EACH ROWを操作しています。つまり、トリガーを起動したステートメントに含まれている各行についてです。 INSERTトリガー内では、行の値NEWは、別名NEWでアクセス可能な疑似テーブル/疑似行にあります。 UPDATEトリガーの場合は、NEWOLDのロー値があり、DELETEトリガーの場合はOLDとなります。

  • AFTER INSERTは意味をなさないと思われます。私はBEFORE INSERTを探していると思います。つまり、INSERT INTO ...クエリを処理している間に、の前にが新しく挿入された行が実際にテーブルに書き込まれます。結果の行には、トリガーが変更した場所以外の元の値が含まれます。

  • SELECT ... INTO変数はit can bite you in a way a scalar subquery can'tため、予期せず変更されていない変数を残す代わりに予想されるようにNULLにそれを設定することで、あなたが習慣に入るべきではないやり方です。この場合、違いはありませんでしたが、それでも注意する価値があります。この場合、中間変数を削除しました。サブクエリが唯一のオプションです。

あなたは別のテーブルで見つかった値を使用して、このテーブルに値を設定しようとしている場合は、あなたがする必要があるすべての行の代わりに提供された値で使用したい値に等しいSET NEW.column_nameです挿入ステートメント。

CREATE TRIGGER `test` 
BEFORE INSERT ON `user_details` FOR EACH ROW 
BEGIN 
    IF NEW.user_count = 0 /* maybe also >> */ OR NEW.user_count IS NULL /* << this */ THEN 
    SET NEW.user_count = (SELECT ui.u_count 
          FROM user_info ui 
          WHERE ui.id = NEW.id_c); 
    END IF; 
END 

ここでも、2つのテーブルは元の質問の内容に基づいて接続されているかは不明だが、これはあなたが達成しようとしている何に見えます。

関連する問題