Обновить и показать MySQL запрос - PullRequest
1 голос
/ 28 июня 2011
UPDATE myTable SET niceColumn=1 WHERE someVal=1;

SELECT * FROM myTable WHERE someVal=1;

Есть ли способ объединить эти два запроса в один? Я имею в виду, могу ли я выполнить запрос на обновление, и он показывает строки, которые он обновляет. Поскольку здесь я использую фильтрацию «где id = 1» дважды, я не хочу этого. Также я думаю, что если someVal изменится до запроса select, у меня возникнут проблемы с тем, что я получу (например, update обновит его, и после этого someVal станет 0 из-за другого скрипта).

Ответы [ 3 ]

2 голосов
/ 28 июня 2011

Оберните два запроса в транзакции требуемым ISOLATION LEVEL, чтобы другие потоки не могли повлиять на заблокированные строки между обновлением и выбором.

0 голосов
/ 28 июня 2011

На самом деле, даже то, что вы сделали, не покажет обновленные строки, потому что между тем (после обновления) некоторый процесс может добавлять / изменять строки.обновлено вчера:)

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

CREATE TEMPORARY TABLE to_be_updated
SELECT id
FROM myTable
WHERE someVal = 1;

UPDATE myTable
SET niceColumn = 1
WHERE id IN (SELECT * FROM to_be_updated);

SELECT *
FROM myTable
WHERE id IN (SELECT * FROM to_be_updated)
0 голосов
/ 28 июня 2011

Если в вашем реальном коде условная часть (где и так далее) слишком длинная для повторения, просто поместите ее в переменную, которую вы используете в обоих запросах.

Если вы не столкнетесь с другой проблемой, вам не нужно объединять эти два.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...