2016-06-19 22 views
1

我在MySQL中有四個table1(日期,打開,高,低,關閉, 計算)。我試圖找出一種方法來創建一個觸發器,以便在表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

你似乎意識到'新'而不是'老'。從手冊:「在觸發器主體中,您可以使用別名OLD和NEW來引用主題表中的列(與觸發器關聯的表)。OLD.col_name在更新之前引用現有行的列或刪除。NEW.col_name是指要插入的新行的列或更新後的現有行的列。「 –

+0

@ÁlvaroGonzález:我寫下邏輯如下: set NEW.Calculation =((OLD.High -OLD.Low)* 0.118)+ OLD.Close; 它向我顯示以下錯誤: 錯誤代碼:1363.在插入觸發器上沒有舊行 –

+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

我收到以下錯誤: CREATE TRIGGER'updatetable1' before insert ON'table1' FOR EACH ROW begin declare prev_low float \t錯誤代碼:1064.您的SQL語法錯誤;檢查與您的MySQL服務器版本相對應的手冊,在第3行附近使用正確的語法 –

+1

這可能與您使用的分隔符有關。檢查小提琴:你可以看到它的工作原理(我把分隔符設置爲'//')。 – trincot

+0

爲了說明問題,我剛纔在回答中添加了觸發器前後的分隔符修飾語句。正如你已經擁有它們,我沒有提供它們在我的原始版本,但顯然你沒有讓他們... – trincot