2017-08-01 60 views
0

好吧,所以我在Sequel Pro(用於Mac的MySQL應用程序)中放置了一個財務數據庫。我有一張記錄價格/庫存水平的表格,我將擁有一個保存計算值(如日常變化)並最終移動平均值等的第二個表格。我認爲計算一次這些東西會更好一些當更新/插入值時,而不是在將數據拉出時。續集臨觸發器,更新第二個表中的計算字段

我在使用與ROW_NUMBER臨時表()等價物來處理計算工作日,而不僅僅是普通天或不連續的日期/ IDS

本質的問題是,(更新後)觸發似乎沒有做任何事情,但它似乎也沒有標誌任何失敗。我只是通過改變一些現有值來測試它,並且計算的字段保持不變。我猜這是一個語法的東西? SequelPro/MySQL是一個有點怪異,我仍然看到,因爲我通常有SQL Server將在我的日常工作......

BEGIN 

CREATE TEMPORARY TABLE IF NOT EXISTS predata AS 
(SELECT thedate 
,price_cash 
,price_3m 
,stocks 
FROM aluminium 
WHERE thedate BETWEEN DATE_ADD(NEW.thedate,INTERVAL -6 DAY) 
AND DATE_ADD(NEW.thedate,INTERVAL 5 DAY)); 

CREATE TEMPORARY TABLE IF NOT EXISTS temp1 AS 
(SELECT t.*, @rownum := @rownum + 1 AS rank 
FROM predata t, 
(SELECT @rownum := 0) r 
ORDER BY thedate ASC); 

CREATE TEMPORARY TABLE IF NOT EXISTS temp2 AS(SELECT * FROM temp1); 

CREATE TEMPORARY TABLE IF NOT EXISTS result_delta AS 
(
SELECT b.thedate 
,(b.price_cash - a.price_cash) AS delta_cash 
,(b.price_3m - a.price_3m) AS delta_3m 
,(b.stocks - a.stocks) AS delta_stocks 
FROM temp1 a 
INNER JOIN temp2 b ON b.rank-1 = a.rank 
WHERE b.thedate = NEW.thedate 
OR a.thedate = NEW.thedate 
); 

UPDATE aluminium_calcs a 
INNER JOIN result_delta r ON a.thedate = r.thedate 
SET a.delta_cash = r.delta_cash 
, a.delta_3m = r.delta_3m 
, a.delta_stocks = r.delta_stocks; 

END 
+0

這是觸發器的代碼?你爲什麼不用'old'和'new'來引用正在編輯的行? – Fredster

+0

是的。那麼我使用NEW.thedate來挑選正在更新的行(日期)。然後使用該條目與前一天/之後的一天計算每日更改並在最後更新「計算」表。觸發器只包含基本價格/庫存數據。 「_calcs」表記錄了計算的值 – CalvinGraham

+0

我開始認爲這可能是太多東西要粘在一個觸發器中,也許最好將它整合到一組存儲過程中,以用於各種不同的計算的列/指標,並使用觸發器以日期爲參數調用過程?但問題10657說絕對不會那樣做。 – CalvinGraham

回答

0

最終我決定建立在PHP一組額外的代碼,並添加包括('deltas_update.php')到我的更新屏幕。無論如何,這可能是一個更好的解決方案,因爲使用適當的數組/循環和pho代碼比使用SQL更容易進行計算。 MySQL是相當枯燥的骨頭,但它可能更好,它推動其他更容易可見/可追溯的重工作

相關問題