2012-01-15 107 views
9

有没有一种有效的方式来获取受影响的行ID列表(不是通过PHP的mysql_affected_rows()受影响的行的数量,但受影响的实际行ID)从MySQL中的UPDATE或DELETE查询?在MySQL中更新/删除并获取受影响的行ID列表?

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

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

上述方式似乎效率很低。有没有更有效的方式来获取MySQL中受影响的行ID?

+0

做我的答案前面的工作由一个逗号? – redmoon7777 2012-01-16 00:07:30

回答

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); 
+0

你应该开一个关于这个问题的新问题,因为它是一个不同的情况。您还应该包括您使用的查询和报告的错误。 (如果是这样,给我提供新问题的链接,我会很乐意提供帮助) – redmoon7777 2014-02-19 22:01:46

+0

我解决了它,输入我的评论和示例,编辑器不允许我得到一个新的行,所以没关系。 – Dan 2014-02-19 22:06:21

13

您可以创建一个触发器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'; 

这个w生病返回删除的ID在每一个字符串

+0

我建议使用这个触发器。 'CREATE TRIGGER mytable_delete ON MYTABLE AFTER DELETE FOR EACH ROW SET @deletedIDs = TRIM(LEADING '' FROM CONCAT_WS( '',@deletedIDs,OLD.id))' 此删除前端逗号。 – Sirio 2017-01-23 14:52:11

相关问题