2017-08-01 51 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是相当枯燥的骨头,但它可能更好,它推动其他更容易可见/可追溯的重工作

相关问题