2012-02-28 38 views
2

我在我的数据库3个表和他们都互相依赖是否可以创建一个涉及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个重要的一步必须从第三个表中获得项目的类别ID

然后我必须根据当前和以前的项目状态增加和减少计数器

是否有可能创建一个触发器来做到这一点?

////////////////////////////////////////////// ////编辑///////////////////////////////////

是有可能的,而不是只是假设前面的状态,指定在代码中使用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

是的,它可能 -

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 
.... 
+0

感谢名单,我已经更新了我的问题,请大家看看 – max 2012-02-28 10:46:16

+0

可以使用CASE statament的第二个版本 - CASE WHEN [状态],然后导致[当[状态],然后导致... ] [其他]结果。更多信息 - http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html – Devart 2012-02-28 12:06:21

+0

我已经添加了一个例子。 – Devart 2012-02-28 12:11:11