在mysql中更新/删除并获取受影响的行ID列表?

arc*_*eta 11 php mysql rows-affected

是否有一种有效的方法可以从mysql中的UPDATE或DELETE查询中获取受影响的行ID列表(不是通过PHP的mysql_affected_rows()受影响的行的#,而是受影响的实际行ID)?

在postgresql中,UPDATE/DELETE查询中有一个RETURNING子句,可用于指定返回的受影响行的值.

在mysql中,获取受影响行的"强力"方式似乎是:1.获取READ LOCK.2.使用UPDATE/DELETE查询的WHERE条件SELECT to以获取受影响的行ID.3.更新/删除.4.释放锁定.

上述方式似乎非常低效.是否有更有效的方法来获取mysql中受影响的行ID?

Amr*_*mro 14

您可以创建触发器

从MySQL 5.0.2开始包括对触发器的支持.触发器是与表关联的命名数据库对象,并在表发生特定事件时激活.

以下代码在名为mytable具有字段的表上创建触发器id

CREATE TRIGGER mytable_delete
AFTER DELETE ON mytable
FOR EACH ROW SET @deletedIDs = CONCAT_WS(',', @deletedIDs, OLD.id)
Run Code Online (Sandbox Code Playgroud)

请注意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';
Run Code Online (Sandbox Code Playgroud)

这将返回已删除的ID,每个ID前面都有一个字符串中的逗号


red*_*777 9

试试这个,它会将更新后的ID返回为"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);
Run Code Online (Sandbox Code Playgroud)