如果所有子列都有相同的数据,如何使用触发器mysql更新父列

时间:2018-08-27 06:32:25

标签: mysql triggers

我有一个表名“ sys_parent”,如下所示:

  |-----|------|--------|
  | id  | name | status |
  |-----|------|--------|
  | 101 | bi   |   n    |    

和下面的另一个表'sys_child'

   |-----|-----------|--------|--------|
   | id  | parent_id | name   | status |
   |-----|-----------|--------|--------|
   | 1   |     101   |   b    |   n    |
   | 2   |     101   |   c    |   n    |
   | 3   |     101   |   d    |   y    |

其中sys_child。parent_id是sys_parent的外键。id 问题是,如果我将sys_child的每个状态都更新为“ n”,则父sys_parent。status将更新为“ n”,反之亦然。我尝试过

  DELIMITER $$
 CREATE TRIGGER new_trigger 
    AFTER UPDATE ON sys_child
       FOR EACH ROW 
            BEGIN
             SET @changetype = (SELECT COUNT(*) FROM sys_child GROUP BY `status`);
             SET @statustype = (SELECT `status` FROM sys_child GROUP BY `status`);
                     IF @changetype < 2
                            THEN UPDATE sys_parent
                                SET  `status`= @statustype;
                        END IF;
  END$$
 DELIMITER; 

但是它不起作用。我如何使用mysql触发器来实现这一目标?

1 个答案:

答案 0 :(得分:0)

此触发器将执行您想要的操作。在更新中,它找出当前孩子的父母有多少孩子(num_children),然后找出其中有多少孩子与当前孩子的状态相同(this_status)。如果这些值相同,则所有子级都具有相同的状态,并使用该值更新父级。

DELIMITER $$
CREATE TRIGGER new_trigger 
  AFTER UPDATE ON sys_child
  FOR EACH ROW
    BEGIN
        DECLARE num_children, this_status INT;
        SELECT COUNT(*) INTO num_children FROM sys_child WHERE parent_id = NEW.parent_id;
        SELECT COUNT(*) INTO this_status FROM sys_child WHERE parent_id = NEW.parent_id AND status = NEW.status;
        IF num_children = this_status THEN
            UPDATE sys_parent SET status= NEW.status;
        END IF;
    END $$
DELIMITER ;