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,
我试图使用它像这一点,但总是最后声明似乎将要执行
感谢名单,我已经更新了我的问题,请大家看看 – max 2012-02-28 10:46:16
可以使用CASE statament的第二个版本 - CASE WHEN [状态],然后导致[当[状态],然后导致... ] [其他]结果。更多信息 - http://dev.mysql.com/doc/refman/5.5/en/control-flow-functions.html – Devart 2012-02-28 12:06:21
我已经添加了一个例子。 – Devart 2012-02-28 12:11:11