ОБНОВИТЬ / УДАЛИТЬ в 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';

это вернет удаленные идентификаторы, перед каждым из которых стоит запятая в строке

sql mysql php

Попробуйте это, он вернет обновленные идентификаторы как "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);
Другие вопросы по тегам