UPDATE / DELETE в mysql и получить список уязвимых идентификаторов строк?

Есть ли эффективный способ получить список уязвимых идентификаторов строк (а не # из затронутых строк через PHP mysql_affected_rows (), но фактические идентификаторы строк, которые были затронуты) из запроса UPDATE или DELETE в mysql?

В postgresql существует предложение RETURNING в запросах UPDATE / DELETE, которые могут использоваться для указания значений из поврежденных строк, которые возвращаются.

В mysql метод «грубой силы» для получения затронутых строк выглядит следующим образом: 1. Приобретите READ LOCK. 2. SELECT с условием WHERE запроса UPDATE / DELETE, чтобы получить уязвимые идентификаторы строк. 3. ОБНОВЛЕНИЕ / УДАЛЕНИЕ. 4. БЛОКИРОВКА.

Вышеупомянутый способ кажется очень неэффективным. Есть ли более эффективный способ получить уязвимые идентификаторы строк в mysql?

Solutions Collecting From Web of "UPDATE / DELETE в mysql и получить список уязвимых идентификаторов строк?"

Вы можете создать триггер

Поддержка триггеров включена с 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);