1

誰かが私が次のように書くのを手伝ってくれました:

CREATE TRIGGER update_stats AFTER UPDATE ON user_hours FOR EACH ROW
INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES
(OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
(NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
ON DUPLICATE KEY UPDATE
completed_hours = completed_hours + VALUES(completed_hours);

ただし、トリガーは次の場合にのみ実行する必要があります。

UPDATE user_hours JOIN user_calendar USING (user_calendar_id, opportunity_id)
SET    user_hours.completed_hours = agreed_hours,
user_hours.hours_committed = 'completed'
WHERE  user_hours.hours_committed = 'accepted' 
AND user_hours.completed_hours IS NULL
AND user_calendar.date_start = CURRENT_DATE();

現状では、管理者またはユーザーの completed_hours が手動で調整された場合、更新トリガーは引き続き実行されます。コードにいくつかの IF ステートメントを追加したいのですが、私の試みはすべてトリガーを作成できませんでした。

私は次のようなものを探しています:

CREATE TRIGGER update_stats AFTER UPDATE ON user_hours FOR EACH ROW
IF hours_committed = 'completed' THEN
INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES
(OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
(NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
ON DUPLICATE KEY UPDATE
completed_hours = completed_hours + VALUES(completed_hours);
END IF
END

助けてくれる人なら誰でも、特定の条件が満たされない限りトリガーを実行したくないだけで、必要なコードが機能することに悩まされますが、これにより、調整クエリが実行されていない日は問題が発生します。

前もって感謝します。

マーク

4

1 に答える 1

2

トリガーは常に実行されます。その条件をトリガーの本体に追加し、新しく更新された列 ( new.column)を比較する必要があります。

DELIMITER //

CREATE TRIGGER update_stats AFTER UPDATE ON user_hours 
FOR EACH ROW
BEGIN
  IF NEW.hours_committed = 'completed' THEN
    INSERT INTO hours_statistics (user_id, opportunity_id, completed_hours) VALUES
      (OLD.user_id, OLD.opportunity_id, -OLD.completed_hours),
      (NEW.user_id, NEW.opportunity_id, +NEW.completed_hours)
    ON DUPLICATE KEY UPDATE
      completed_hours = completed_hours + VALUES(completed_hours);
  END IF;
END//
于 2012-08-26T15:35:53.417 に答える