Есть ли эффективный способ получить список уязвимых идентификаторов строк (а не # из затронутых строк через PHP mysql_affected_rows (), но фактические идентификаторы строк, которые были затронуты) из запроса UPDATE или DELETE в mysql?
В postgresql существует предложение RETURNING в запросах UPDATE / DELETE, которые могут использоваться для указания значений из поврежденных строк, которые возвращаются.
В mysql метод «грубой силы» для получения затронутых строк выглядит следующим образом: 1. Приобретите READ LOCK. 2. SELECT с условием WHERE запроса UPDATE / DELETE, чтобы получить уязвимые идентификаторы строк. 3. ОБНОВЛЕНИЕ / УДАЛЕНИЕ. 4. БЛОКИРОВКА.
Вышеупомянутый способ кажется очень неэффективным. Есть ли более эффективный способ получить уязвимые идентификаторы строк в 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);