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

时间:2012-01-15 22:12:09

标签: 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?

2 个答案:

答案 0 :(得分:14)

您可以创建Trigger

  

从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';

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

答案 1 :(得分: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);