ОБНОВИТЬ / УДАЛИТЬ в MySQL и получить список затронутых идентификаторов строк?
Есть ли эффективный способ получить список затронутых идентификаторов строк (не # количество затронутых строк с помощью mysql_affered_rows () PHP, но фактические идентификаторы строк, которые были затронуты) из запроса UPDATE или DELETE в mysql?
В postgresql в запросах UPDATE/DELETE есть предложение RETURNING, которое можно использовать для указания значений из возвращаемых затронутых строк.
В mysql способ получения поврежденных строк методом "грубой силы" выглядит следующим образом: 1. Получить READ LOCK. 2. Выберите с условием WHERE запроса UPDATE/DELETE, чтобы получить затронутые идентификаторы строк. 3. ОБНОВЛЕНИЕ / УДАЛЕНИЕ. 4. ОТКРЫТЬ ЗАМКА.
Вышеуказанный способ кажется очень неэффективным. Есть ли более эффективный способ получить затронутые идентификаторы строк в MySQL?
3 ответа
Вы можете создать триггер
Поддержка триггеров включена, начиная с MySQL 5.0.2. Триггер - это именованный объект базы данных, связанный с таблицей, который активируется, когда для таблицы происходит определенное событие.
следующий код создает триггер для таблицы с именем mytable
у которого есть поле id
CREATE TRIGGER mytable_delete
AFTER DELETE ON mytable
FOR EACH ROW SET @deletedIDs = CONCAT_WS(',', @deletedIDs, OLD.id)
заметить, что OLD
относится к удаленной строке
После того как вы создали триггер для таблицы, вы можете использовать его следующим образом:
/* empty parameter defined in CREATE TRIGGER */
Set @deletedIDs = '';
/* perform your query */
DELETE FROM mytable WHERE myotherfield = 'myfilterevalue';
/* get the parameter */
SELECT @deletedIDs AS 'Deleted_IDs';
это вернет удаленные идентификаторы, перед каждым из которых стоит запятая в строке
Попробуйте это, он вернет обновленные идентификаторы как "1,2,3....":
SET @uids := '';
UPDATE table_name
SET some_col= 'some_val'
WHERE some_col= 'some_val'
AND ( SELECT @uids := CONCAT_WS(',', @uids, id) );
SELECT TRIM(LEADING ',' FROM @uids);
Используя ответ @redmoon7777, он получает обновленныйids
и соедините их сuids
, но я обнаружил, что столбцы не обновляются.
Возможно, на момент его ответа он обновлялся, но это было более 8 лет назад, поэтому я считаю, что он может работать на старых версиях MySQL.
Но используя его на версии 5.7.14 и, возможно, выше, обновление не произойдет.
Так же, как и его решение, я добавил дополнительное условие для обновления столбцов.
SET @uids := '';
UPDATE table_name SET some_col= 'some_val' WHERE some_col= 'some_val' AND ( SELECT @uids := CONCAT_WS(',', @uids, id)) != '';
SELECT TRIM(LEADING ',' FROM @uids);