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...