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

标签 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 触发器来实现这一点?

最佳答案

此触发器将执行您想要的操作。在更新时,它会找出当前子级的父级有多少个子级 (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 ;

关于mysql - 如果所有子列具有相同的数据,如何使用触发器mysql更新父列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52033689/

相关文章:

linq - 用 LINQ-to-SQL 模仿 SQL 插入触发器

php - PHP 的 SQL 触发事件

java - 如何在 hibernate 中从数据库获取数据时限制重复

OSX 上的 Python3 到 MySQL 连接 ...ImportError : Reason: Image not found

mysql 查询 - 需要一些关于分组的帮助

java - 将mysql分成几组进行交叉验证

postgresql - 根据计数限制插入的通用触发器

sqlite - 在 CHECK 约束中使用子查询的替代方法?

mysql - 仅当在另一个字段中输入非 NULL 值时才更新时间戳

php - 在 INSERT (PHP) 中将 2 个不同的查询合并为一个