我有一个表名“ 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触发器来实现这一目标?
答案 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 ;