2016-06-19 8 views
1

私はMySQLのテーブル1に4つの列を持っています(日付、オープン、ハイ、ロー、クローズ、 計算)。私は、新しい値がテーブル1で更新されたときに、計算フィールドが前の行の値を使用して更新されるようなトリガーを作成する方法を見つけようとしています。私は現在使用して計算フィールドを更新するには、以下のトリガーを使用しています現在、ハイ現在低と近い今MySQLトリガーの前の行の値にアクセスします。

DELIMITER // 
create TRIGGER `updatetable1` before insert ON `table1` FOR EACH ROW begin 
    set NEW.Calculation=((NEW.High-New.Low)*0.118)+NEW.Close; 
    end // 
DELIMITER ; 

私は次のロジックを使用して式を少し変更したい現在

Calculation (i) =((High(i-1) -Low(i-1))*0.118)+Close(i-1); 

はどのようにしてアクセスすることができました以前行値の高、低とクロのeを現在の計算の行の値を更新するこのトリガーで?

例:

enter image description here

+0

「NEW」は認識していますが、「OLD」は認識していないようです。マニュアルから:「トリガー本体内で、別名OLDおよびNEWを使用して、サブジェクト表(トリガーに関連付けられた表)の列を参照できます。OLD.col_nameは、更新前の既存の行の列を参照しますNEW.col_nameは、挿入する新しい行の列または更新後の既存の行を参照します。 " –

+0

@ÁlvaroGonzález:以下のようにロジックを書きました。 NEW.Calculation =((OLD.High -OLD.Low)* 0.118)+ OLD。閉じる。 これは私に次のエラーを表示します: エラーコード:1363. INSERTトリガーにOLD行がありません。 –

+0

申し訳ありませんが、私はあなたの質問を誤解しました。あなたがUPDATEトリガーを書いていると思いました。 –

答えて

1

次のようにあなたのトリガーを書き換えることができます:どちらのデータ型あなたが

DELIMITER // 

create TRIGGER `updatetable1` before insert ON `table1` FOR EACH ROW 
begin 
    declare prev_low float; 
    declare prev_high float; 
    declare prev_close float; 

    select low, high, close 
    into  prev_low, prev_high, prev_close 
    from  table1 
    order by date desc 
    limit 1; 

    set NEW.Calculation=(prev_high-prev_low)*0.118 + prev_close; 
end// 

DELIMITER ; 

SQL fiddle

変更prev_low(および他の変数)のデータ型を使用しますあなたのテーブルに。

+0

次のエラーが発生しました: 挿入前に 'updatetable1'をオンにする前に' table1'を宣言してくださいFOR EACH ROW begin declare prev_low float \tエラーコード:1064. SQL構文にエラーがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックし、適切な構文を使用して、近くの '3行目で使用してください。 –

+1

おそらく使用する区切り文字に関連しています。フィドルをチェックしてください:私は区切り文字を '//'に設定しています。 – trincot

+0

説明のために、私はちょうど今私の答えでトリガーの前後に区切り文字を変更するステートメントを追加しました。あなたはすでにそれらを持っていたので、私は元のバージョンでそれらを提供していませんでしたが、明らかにあなたはそれらを保持していませんでした... – trincot

関連する問題