ОБНОВИТЬ / УДАЛИТЬ в MySQL и получить список затронутых идентификаторов строк? - PullRequest
11 голосов
/ 16 января 2012

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

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

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

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

Ответы [ 2 ]

14 голосов
/ 24 февраля 2012

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

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

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

9 голосов
/ 16 января 2012

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