【问题标题】:MySQL update field from latest field in another tableMySQL 从另一个表中的最新字段更新字段
【发布时间】:2016-05-19 02:01:02
【问题描述】:

我在尝试实施我正在寻找的解决方案时一直遇到问题,我认为这将是一个简单的查询。

设置:

表 1:UID、Field1、时间戳

表 2:UID、fk_table1UID、Field1、时间戳

表 1 有一个 on before update 触发器,它将整个 OLD 行插入到表 2 中。(有效地保留表 1 的更改日志)

表2也有fk_table1UID到table1.UID的外键约束

问题:

我想要做的只是构建一个查询

(伪代码) 更新 table1.Field1 WHERE UID = X(用户输入) 和 table2.Field1 WHERE table2.TimeStamp = max(table2.TimeStamp) AND table2.fk_table2UID = table1.UID

我已经尝试过使用内部连接进行更新的不同尝试,但我遇到了一个问题,说我无法引用已调用的表或其他东西。 (我相信与我的触发器有关..)

问题:

如何在单个呼叫查询中解决这个问题?

【问题讨论】:

  • 嗨 DarbyM,如果您标记了 Barmar 的答案,我很好,但如果我的答案有效,请告诉我。用于学习目的。谢谢。 :)

标签: mysql mysql-workbench


【解决方案1】:

试试这个:

UPDATE table1
       SET table1.Field1 = (SELECT table2.Field1 FROM table2 WHERE table2.UIDfk = X ORDER BY table2.TimeStamp DESC LIMIT 1)
WHERE table1.UID = X

【讨论】:

  • 你确定这会起作用吗? MySQL 对何时可以在子查询中使用 LIMIT 有限制,我认为这可能是其中之一。
  • 不确定,我不是 mySQL 专家,但这种查询将分别使用 ROWNUM 和 TOP 在 ORACLE 和 SQL Server 上工作。
【解决方案2】:

加入返回所需值的子查询。

UPDATE table1 AS t1
JOIN (SELECT Field1 FROM table2
      WHERE fk_table1UID = @X
      ORDER BY TimeStamp DESC
      LIMIT 1) AS t2
SET t1.Field1 = t2.Field1
WHERE UID = @X

【讨论】:

  • 我将在今天晚些时候使用计算机时再试一次。但我相信当表 1 也有更新表 2 的触发器时,这样做会出现问题。
  • 在我看来,整个操作可能必须在事务中完成。因此,我可以同时锁定表 2 和表 1 中的一行,并将表 2 中的结果设置为一个变量,在表 1 更新中使用该变量。问题是我没有使用过启动事务,所以我不熟悉如何做到这一点。
  • 每个查询都在自己的事务中自动完成。如果您将其拆分为单独的查询,您只需要一个事务。
猜你喜欢
  • 1970-01-01
  • 2015-10-03
  • 2011-02-15
  • 2014-03-06
  • 2018-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-20
相关资源
最近更新 更多