我有一个表名称“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/