2016-07-25 2 views
0

私はこの問題を解決しようとしてきました。トリガーmysql未知のテーブル

CREATE TRIGGER some_trigger AFTER UPDATE ON table_a 
    FOR EACH ROW BEGIN 
    DECLARE tname VARCHAR(20); 
    IF (table_a.field_offer=1) THEN 
     SET tname='table_b'; 
    ELSEIF (table_a.field_offer=0) THEN 
     SET tname='table_c'; 
    END IF; 
     IF ((new.field_state = 0)) THEN 
     UPDATE tname join table_a on tname.ID=table_a.ref_field 
     SET tname.STOCK = tname.STOCK -1; 
     ELSEIF ((new.field_state = 1)) THEN 
     UPDATE tname join table_a on tname.ID=table_a.ref_field 
     SET tname.STOCK = tname.STOCK +1; 
     END IF; 
    END; 

私は取得しています:

不明なテーブル 'table_a' フィールドリストのここでは、コードです。 Field_offerとfield_stateは になります。

+1

NEWとOLDのトリガー関数内のテーブルで現在の値にアクセスする必要があります。 –

+0

上記のコメントに加えて、(tnameなどの)変数をクエリのテーブル名として使用することもできません。 – Uueerdo

答えて

0

私は質問へのコメントで言われたの下に示しました:MySQLはあなたがトリガーされたテーブルのデータを変更することはできませんよう

CREATE TRIGGER some_trigger AFTER UPDATE ON table_a 
    FOR EACH ROW BEGIN 
    DECLARE tname VARCHAR(20); 
    IF (NEW.field_offer=1) THEN 
     UPDATE `table_b` 
     SET STOCK = CASE NEW.field_state 
        WHEN 0 THEN STOCK - 1 
        WHEN 1 THEN STOCK + 1 
        ELSE STOCK 
        END 
     WHERE ID=NEW.ref_field 
     ; 
    ELSEIF (NEW.field_offer=0) THEN 
     UPDATE `table_c` 
     SET STOCK = CASE NEW.field_state 
        WHEN 0 THEN STOCK - 1 
        WHEN 1 THEN STOCK + 1 
        ELSE STOCK 
        END 
     WHERE ID=NEW.ref_field 
     ; 
    END IF; 
    ... 

注私はUPDATE ... JOINから更新を変更;あなたが実際にtable_aを更新していない間に、JOINはMySQLに対抗するのに十分であったかもしれません...そして、table_aの一致を持っていたtable_b/cのすべての行を結合で更新しました。table_aまたはトリガーの行。

+0

それは完全に動作します。ありがとうございました。 – sltd

+0

@sltd回答を受け入れたとマークすることを忘れないでください。 – Uueerdo

関連する問題