Sequel Pro Trigger, обновление вычисляемых полей во второй таблице

Итак, я собираю финансовую базу данных в Sequel Pro (приложение MySQL для Mac). У меня есть таблица, в которой регистрируются цены/уровни запасов, и у меня будет вторая таблица, в которой хранятся расчетные значения, такие как дельты (ежедневные изменения) и, в конечном итоге, скользящие средние и т. д. Я полагаю, что лучше рассчитать эти вещи один раз. когда значения обновляются/вставляются, а не при извлечении данных.

Мне приходится использовать временные таблицы с эквивалентами row_number() для расчета рабочих дней, а не просто обычных дней или непоследовательных дат/идентификаторов.

По сути, проблема заключается в том, что триггер (после обновления), похоже, ничего не делает, хотя, похоже, он также не отмечает никаких сбоев. Я просто иду, чтобы проверить это, изменив некоторые существующие значения, и вычисляемые поля остаются прежними. Я предполагаю, что это синтаксис? 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

person CalvinGraham    schedule 01.08.2017    source источник
comment
Это код триггера? Почему вы не используете old и new для ссылки на редактируемую строку?   -  person Fredster    schedule 01.08.2017
comment
Да. Ну, я использую NEW.thedate, чтобы выбрать обновляемую строку (день). Затем эта запись используется со днями до/после для расчета ежедневных изменений и обновления таблицы «расчетов» в конце. Триггер находится в таблице, которая содержит только основные данные о цене/акции. Таблица _calcs регистрирует рассчитанные значения.   -  person CalvinGraham    schedule 01.08.2017
comment
Я начал думать, что, возможно, это слишком много, чтобы вставлять его в триггер, возможно, было бы лучше объединить все это в набор хранимых процедур для различных вычисляемых столбцов/показателей и использовать триггер для вызова процедуры с датой в качестве параметра? Но затем вопрос 10657 говорит, что этого делать определенно не следует.   -  person CalvinGraham    schedule 01.08.2017


Ответы (1)


В конце концов я просто решил создать набор дополнительного кода на php и добавить Include('deltas_update.php') на экран обновления. В любом случае, это, вероятно, лучшее решение, поскольку проще выполнять вычисления с правильными массивами/циклами и кодом pho, чем с SQL. MySQL довольно прост, но, вероятно, лучше, если он перенесет тяжелую работу в другое место, где ее легче увидеть/отследить.

person CalvinGraham    schedule 16.09.2017