MySQL: возвращает обновленные строки

Я пытаюсь объединить эти два запроса в 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 в дополнительный запрос, но я не думаю, что весь запрос возвращает мне то, что я хочу.

Есть ли способ сделать это? (даже лучше, без подзапроса) Или мне просто нужно придерживаться двух запросов?

Спасибо,

Цюань

Ответ 1

Вы не можете напрямую комбинировать эти запросы. Но вы можете написать хранимую процедуру, которая выполняет оба запроса. Пример:

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

По-видимому, у mysql есть что-то, что может быть полезно, особенно если вы только обновляете одну строку.

Этот пример: http://lists.mysql.com/mysql/219882

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

SELECT @mycolumn;

Я никогда не пробовал этого, но дайте мне знать, как вы поживаете.

Ответ 3

Итак, что вы пытаетесь сделать, это reset time до нуля, когда вы обращаетесь к строке - вроде как триггер, но MySQL не может запускать триггеры после SELECT.

Вероятно, лучший способ сделать это с одним запросом сервера из приложения - написать хранимую процедуру, которая обновляет и затем возвращает строку. Если очень важно, чтобы эти два случая происходили вместе, заверните два оператора в транзакции.

Ответ 4

Существует более быстрая версия возврата обновленных строк и более корректная при работе с высоконагруженной системой запрашивает одновременное выполнение запроса на одном сервере базы данных

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

Ответ 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...