MySQL:返回更新的行

时间:2012-07-13 19:30:40

标签: mysql return

我试图在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放在子查询中,但我不认为整个查询会返回我想要的内容。

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

谢谢,

6 个答案:

答案 0 :(得分:6)

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

此示例来自:http://lists.mysql.com/mysql/219882

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

SELECT @mycolumn;

我从来没有试过这个,但请告诉我你是怎么过的。

答案 1 :(得分:3)

您无法直接合并这些查询。但是您可以编写执行两个查询的存储过程。例如:

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 ;

答案 2 :(得分:2)

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

使用来自应用程序的一个服务器请求执行此操作的最佳方法可能是编写一个更新的存储过程,然后返回该行。如果将两者一起发生非常重要,请将两个语句包装在一个事务中。

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

这真的很晚,但是我遇到了同样的问题,我发现最有帮助的解决方法是:

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

答案 5 :(得分:0)

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