11

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

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

在 mysql 中,获取受影响行的“蛮力”方式似乎是: 1. 获取 READ LOCK。2. 使用 UPDATE/DELETE 查询的 WHERE 条件选择以获取受影响的行 ID。3. 更新/删除。4. 解除锁定。

上面的方式看起来效率很低。有没有更有效的方法来获取 mysql 中受影响的行 ID?

4

2 回答 2

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)

注意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 都以字符串中的逗号开头

于 2012-02-24T08:30:24.497 回答
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);
于 2012-01-15T22:34:51.367 回答