Можно ли создать триггер, включающий 3 таблицы и условные операторы? - PullRequest
2 голосов
/ 28 февраля 2012

У меня есть 3 таблицы в моей базе данных, и все они зависят друг от друга

есть таблица проекта

+-----------+---------------------+-------------------------------------------------+
| id        | project name        |status (1 confirmed / 2 in progress / 3 done )   |
+-----------+---------------------+-------------------------------------------------+
|   233     | project 1           |1                                                |
+-----------+---------------------+-------------------------------------------------+
|  234      | project 2           | 3                                               |
+-----------+---------------------+-------------------------------------------------+

Таблица 2 - это категория

+-----------+---------------------+-------------------+-------------------+-------------------+ 
| id        | category            | confirmed_counter | inprogress_counter|done_counter       |
+-----------+---------------------+-------------------+-------------------+-------------------+
|         1 | c++                 |      2            |3                  | 1                 |
+-----------+---------------------+-------------------+-------------------+-------------------+
|         2 | php                 |      3            |4                  | 6                 |
+-----------+---------------------+-------------------+-------------------+-------------------+

и таблица 3 - объекты категории

+-----------+---------------------+------------+ 
| id        | project_id          | category_id|
+-----------+---------------------+------------+
|         1 | 233                 |      2     |
+-----------+---------------------+------------+
|         2 | 244                 |      3     |
+-----------+---------------------+------------+

Я хочу создать триггер для обновления счетчиков категории при изменении статуса проекта

когда администратор подтверждает проект, его статус изменится на 1, поэтому в таблице категорий confirmed_counter должен увеличиваться но сначала я должен посмотреть на объекты категорий и посмотреть, что является категорией или категориями этого проекта, а затем обновить поле счетчика для этих категорий

$c = $project->get_categorys();
///// it returns array of that project category ids ( 2 ,3 ,4)
$sql = update `categorys` set `confirmed_counter` = confirmed_counter+1 where `id` in (2,3,4);

и когда проект выполняется

$sql = update `categorys` set `confirmed_counter` = confirmed_counter-1 , `inprogress_counter` = inprogress_counter+1 where `id` in (2,3,4);

и когда проект закончен

$sql = update `categorys` set `inprogress_counter` = inprogress_counter-1 , `done_counter` = done_counter+1 where `id` in (2,3,4);

и это не всегда в таком порядке проект может быть сброшен во время его выполнения

поэтому перед обновлением счетчиков есть 2 важных шага

сначала я должен получить идентификатор категории проекта из третьей таблицы

тогда мне нужно увеличивать и уменьшать счетчики на основе текущего и предыдущего статуса проекта

возможно ли создать триггер для этого?

/////////////////////////////////////////////// /// edit ///////////////////////////////////

возможно ли вместо того, чтобы просто предполагать предыдущее состояние, указать это с помощью OLD в коде? как изменение

  SET
    confirmed_counter = 
      CASE NEW.status
        WHEN 1 THEN confirmed_counter + 1
        WHEN 2 THEN confirmed_counter - 1
        ELSE confirmed_counter
      END,

до

  SET
    confirmed_counter = 
      CASE NEW.status
        WHEN 1 THEN confirmed_counter + 1
        ELSE confirmed_counter
      END,

    confirmed_counter = 
      CASE OLD.status
        WHEN 1 THEN confirmed_counter - 1
        ELSE confirmed_counter
      END,

Я пытался использовать его таким образом, но всегда кажется, что последний оператор выполняется

1 Ответ

1 голос
/ 28 февраля 2012

Да, это возможно -

CREATE TRIGGER trigger1
  AFTER UPDATE
  ON project
  FOR EACH ROW
BEGIN
  UPDATE category c
    JOIN category_objects co
      ON co.category_id = c.id
  SET
    confirmed_counter = 
      CASE NEW.status
        WHEN 1 THEN confirmed_counter + 1
        WHEN 2 THEN confirmed_counter - 1
        ELSE confirmed_counter
      END,
    inprogress_counter =
      CASE NEW.status
        WHEN 1 THEN inprogress_counter
        WHEN 2 THEN inprogress_counter + 1
        ELSE inprogress_counter - 1
      END,
    done_counter =
      CASE NEW.status
        WHEN 1 THEN done_counter
        WHEN 2 THEN done_counter
        ELSE done_counter + 1
      END
  WHERE
    co.project_id = NEW.id;
END

Пример по второму вопросу:

...
confirmed_counter =
  CASE
    WHEN NEW.status = 1 THEN confirmed_counter + 1
    WHEN OLD.status = 1 THEN confirmed_counter - 1
    ELSE confirmed_counter
END
....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...