【问题标题】:MYSQL How can I update a row in a table after updating the same table?MYSQL 更新同一张表后如何更新表中的一行?
【发布时间】:2021-02-08 08:33:57
【问题描述】:

我的表的每一行都有一个孩子,例如 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。我需要这样做

使用 mySQL 的即时通讯

【问题讨论】:

标签: mysql sql database phpmyadmin


【解决方案1】:

正如您在 cmets 中提到的,MySQL 通常不允许您定义更新触发器,该触发器本身会触发同一张表上的更多更新。假设您使用的是 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 开始的所有记录,并逆向工作到树的根。

【讨论】:

  • 有一些疑问,你能把它应用到我的桌子上吗?表结构为CREATE TABLE `cuentascontables` ( `ID` varchar(255) NOT NULL, `balance` int(255) NOT NULL, `PARENT` varchar(255) NOT NULL, ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
  • @OmarAlmonte 抱歉回复晚了,但您似乎已经发现 CTE 不是表定义的一部分,它是您将运行的更新代码的一部分。
  • 没关系,你能把 CTE 应用到我的桌子上吗?我的意思是相同的代码,但使用我的列名提前谢谢
  • 再一次,CTE 应该在更新语句之前执行,并与更新语句一起执行。 CTE 不会对您的实际代码进行结构更改。
  • 我的意思是,你能用我的列名应用 CTE 吗?抱歉解释不好
猜你喜欢
  • 2016-04-09
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
相关资源
最近更新 更多