2017-07-11 17 views
0

をエラーを発射声明私は文は私には大丈夫に見えます、しかし、私は、次のMySQLのトリガーで

で迎えていますphpMyAdminの

DELIMITER // 
CREATE NEW TRIGGER credit_refs AFTER UPDATE on investments FOR EACH ROW 
BEGIN 
    DECLARE ref INT(20) 
    DECLARE parent INT(20) 
    DECLARE suparent INT(20) 
    SELECT ref,ref_pa,ref_supa INTO ref,parent,suparent FROM users WHERE tid = OLD.tid; 
     IF(ref != 0) THEN 
     INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES   (ref,OLD.inv,'ref',OLD.tid); 
    IF(parent != 0) THEN 
     INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES    (parent,OLD.inv,'ref_pa',OLD.tid); 
    IF(suparent != 0) THEN 
     INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES      (suparent,OLD.inv,'ref_supa',OLD.tid); 
END // 
DELIMITER ; 

を使用してテーブルの上にトリガーを作成するには、この文を実行していIFエラー

静的解析:

解析中に4つのエラーが見つかりました。

認識されない文の種類。 (253の "IF"の近く)

認識できない文の種類。 (位置372の "IF"の近く)

認識されない文の種類。 (位置505の "IF"の近く)

認識されない文の種類。

MySQLは言っ

CREATE NEW TRIGGER credit_refs AFTER UPDATE on investments FOR EACH ROW BEGIN DECLARE ref INT(20) DECLARE parent INT(20) DECLARE suparent INT(20) SELECT ref,ref_pa,ref_supa INTO ref,parent,suparent FROM users WHERE tid = OLD.tid; IF(ref != 0) THEN INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES (ref,OLD.inv,'ref',OLD.tid); IF(parent != 0) THEN INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES (parent,OLD.inv,'ref_pa',OLD.tid); IF(suparent != 0) THEN INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES (suparent,OLD.inv,'ref_supa',OLD.tid); END 
ドキュメント::(位置643の近くに "END")

SQLクエリドキュメント

#1064 - あなたのSQL構文でエラーが発生しています。 FOR EACH ROWの投資を更新した後に「NEW TRIGGER credit_refs近く

BEGIN 
     DECL' at line 1 

を使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してくださいうまくいけば、ここで誰かがイムがやって何を見せすることができるようになりますここで間違っている。

+0

私はあまりにもmysqlに慣れていませんが、最初に@で宣言された変数に名前を付ける必要はありませんか? –

+0

私は同じ規格で書かれたトリガーを定義しました。 –

+1

@ EstebanP。これはMySQLではなく、msql構文です。@で始まるMySQL変数では、セッション変数があり、トリガーや他のストアドルーチン内で定義された変数とはまったく異なるスコープと役割を持っています。 – Shadow

答えて

1
DELIMITER $$ 
CREATE TRIGGER credit_refs AFTER UPDATE ON investments 
FOR EACH ROW 
BEGIN 
    DECLARE ref INT(20); 
    DECLARE parent INT(20); 
    DECLARE suparent INT(20); 
    SELECT ref,ref_pa,ref_supa INTO ref,parent,suparent FROM users WHERE tid = OLD.tid; 
     IF(ref != 0) THEN 
     INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES   (ref,OLD.inv,'ref',OLD.tid); 
     END IF; 
    IF(parent != 0) THEN 
     INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES    (parent,OLD.inv,'ref_pa',OLD.tid); 
     END IF; 
    IF(suparent != 0) THEN 
     INSERT INTO earnings (`tid`,`amount`,`type`,`ref_tid`) VALUES      (suparent,OLD.inv,'ref_supa',OLD.tid); 
     END IF; 
END; 
$$ 
DELIMITER ; 

上記のクエリを試してください。 MySQL

すべてのIF文はEND IF if文。あなたが複数のためEND IFを逃している必要があります。

希望すると、これが役立ちます。

+0

"MySQLではすべてのIF文がEND IF"でなければなりません。 "SELECT IF(1 = 1、1、0)"は有効なMySQLクエリです...しかし、私が記述したIF関数は異なるIF文です。 IF文は、使用開始されたトピックが本当に 'END IF'を必要とします –

+0

Beginの後にIF文を追加するにはどうしたらいいですか?私は、更新されたフィールドの値が1であればクエリを実行する必要があります。それを自分で追加しようとしましたが、構文エラーが発生しました。 –

+0

@HaiderAliあなたは私の答えを試しましたか? –

1

IFの周りの警告はphpmyadmin自身のチェックに過ぎません。構文エラーはNEWキーワードによって発生しますが、これは必要ありません。 MySQL manual on creating triggersあたりのとおり:

CREATE 
    [DEFINER = { user | CURRENT_USER }] 
    TRIGGER trigger_name 
    trigger_time trigger_event 
    ON tbl_name FOR EACH ROW 
    [trigger_order] 
    trigger_body 

しかし、あなたのIFSはEND IFによって閉鎖されていない、とあなたもdeclare文の最後にセミコロンが欠落しています。

+0

OLDキーワードを意味しますか? cosキーワードはNEWキーワードを使用せず、OLDキーワードなしで投資テーブルの値にアクセスする方法は? –

+0

大変申し訳ございませんが、どういう意味か分かります。 –