【问题标题】:MySQL: return updated rowsMySQL:返回更新的行
【发布时间】:2012-07-13 16:42:05
【问题描述】:

我正在尝试在 twisted python 中组合这两个查询:

SELECT * FROM table WHERE group_id = 1013 and time > 100;

和:

UPDATE table SET time = 0 WHERE group_id = 1013 and time > 100

到单个查询中。有可能吗?

我尝试将 SELECT 放在子查询中,但我认为整个查询不会返回我想要的结果。

有没有办法做到这一点? (更好的是,没有子查询) 还是我只需要坚持两个查询?

谢谢,

【问题讨论】:

  • 这在概念上是两个不同的动作。你想通过某种方式组合它们来获得什么?
  • 我正在努力使我的查询尽可能快,因为它将处理繁重的负载。
  • 好吧,你不能合并这些查询。为了优化速度,请务必正确索引您的表。 EXPLAIN 将帮助您了解需要优化的内容。
  • 如果您的负载非常高,需要进一步提高速度,请考虑集群、使用什么存储引擎以及批量运行查询的可能性。
  • 谢谢。你能详细说明一下聚类吗?

标签: mysql return


【解决方案1】:

显然 mysql 确实有一些可能有用的东西,特别是如果你只更新一行。

这个例子来自:http://lists.mysql.com/mysql/219882

UPDATE mytable SET
mycolumn = @mycolumn := mycolumn + 1
WHERE mykey = 'dante';

SELECT @mycolumn;

虽然我从未尝试过,但请告诉我你的进展情况。

【讨论】:

    【解决方案2】:

    您不能直接组合这些查询。但是您可以编写一个执行这两个查询的存储过程。示例:

    delimiter |
    create procedure upd_select(IN group INT, IN time INT)
    begin
        UPDATE table SET time = 0 WHERE group_id = @group and time > @time;
        SELECT * FROM table WHERE group_id = @group and time > @time;
    end;
    |
    delimiter ;
    

    【讨论】:

    • 在 UPDATE 之后,Squall Leohart 希望返回的行的时间 = 0,因此条件为 time > @time 的 SELECT 将无法按预期工作。
    【解决方案3】:

    所以你要做的就是在你访问一行时将time 重置为零——有点像触发器,但 MySQL 不能在SELECT 之后执行触发器。

    对于来自应用程序的一个服务器请求,最好的方法可能是编写一个更新然后返回行的存储过程。如果让两者同时发生非常重要,请将这两个语句包装在一个事务中。

    【讨论】:

      【解决方案4】:

      有一个更快的版本返回更新的行,并且在处理高负载系统要求在同一数据库服务器上同时执行查询时更正确

      update table_name WITH (UPDLOCK, READPAST)
      SET state = 1
      OUTPUT inserted.
      

      【讨论】:

      • 我相信这只适用于 MS SQL。这篇文章是关于 MySQL 的。
      【解决方案5】:

      聚会真的很晚了,但我遇到了同样的问题,我发现最有帮助的解决方案如下:

      SET @uids := null;
      UPDATE footable
         SET foo = 'bar'
       WHERE fooid > 5
         AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
      SELECT @uids;
      

      来自https://gist.github.com/PieterScheffers/189cad9510d304118c33135965e9cddb

      【讨论】:

        【解决方案6】:

        UPDATE tab SET column=value RETURNING column1,column2...

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-11-10
          • 2014-11-16
          • 2013-11-17
          • 2014-09-23
          • 2021-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多