MYSQL 如何在更新 table 后更新 table 中的一行?
MYSQL How can I update a row in a table after updating the same table?
我的 table 的每一行都有一个子项,例如 ID 1 是 11 的父项,11 是 111 的父项并且每一行都有一个余额,如果我更新 111 的余额,我需要, 11的余额也更新了1的余额
例如:UPDATE ACCOUNTS SET value = 100 WHERE ID = 1
在这种情况下,11 的值将是 100,而 1 的值
然后我可以做这样的事情: UPDATE ACCOUNTS SET value = value + 150 WHERE ID = 11;
在这种情况下,11 的值将是 250,1 的值将是 250,1 的值应该保持 100。我需要做类似的事情
IM 使用 mySQL
正如您在评论中提到的,MySQL 通常不允许您定义一个更新触发器,该触发器本身会在同一个 table 上触发更多更新。假设您使用的是 MySQL 8+,这里的一个选项是定义一个递归 CTE,它针对所有要更新的记录:
WITH RECURSIVE cte (id, value, parent_id) AS (
SELECT id, value, parent_id
FROM ACCOUNTS
WHERE id = 111
UNION ALL
SELECT t1.id, t1.value, t1.parent_id
FROM ACCOUNTS t1
INNER JOIN cte t2
ON t1.id = t2.parent_id
)
UPDATE ACCOUNTS a1
INNER JOIN cte a2
ON a1.id = a2.id
SET value = 100;
这假设您希望对层次结构中的每个匹配 id
执行相同的更新逻辑。 CTE 将生成从 id = 111
开始的所有记录,并在树上向后工作到根。
我的 table 的每一行都有一个子项,例如 ID 1 是 11 的父项,11 是 111 的父项并且每一行都有一个余额,如果我更新 111 的余额,我需要, 11的余额也更新了1的余额
例如:UPDATE ACCOUNTS SET value = 100 WHERE ID = 1
在这种情况下,11 的值将是 100,而 1 的值
然后我可以做这样的事情: UPDATE ACCOUNTS SET value = value + 150 WHERE ID = 11;
在这种情况下,11 的值将是 250,1 的值将是 250,1 的值应该保持 100。我需要做类似的事情
IM 使用 mySQL
正如您在评论中提到的,MySQL 通常不允许您定义一个更新触发器,该触发器本身会在同一个 table 上触发更多更新。假设您使用的是 MySQL 8+,这里的一个选项是定义一个递归 CTE,它针对所有要更新的记录:
WITH RECURSIVE cte (id, value, parent_id) AS (
SELECT id, value, parent_id
FROM ACCOUNTS
WHERE id = 111
UNION ALL
SELECT t1.id, t1.value, t1.parent_id
FROM ACCOUNTS t1
INNER JOIN cte t2
ON t1.id = t2.parent_id
)
UPDATE ACCOUNTS a1
INNER JOIN cte a2
ON a1.id = a2.id
SET value = 100;
这假设您希望对层次结构中的每个匹配 id
执行相同的更新逻辑。 CTE 将生成从 id = 111
开始的所有记录,并在树上向后工作到根。