有没有一种有效的方法可以从mysql中的UPDATE或DELETE查询中获得受影响的行ID列表(不是通过PHP的mysql_affected_rows()获得受影响行的数量,而是受影响的实际行ID)?
在postgresql中,UPDATE/DELETE查询中有一个RETURNING子句,可用于指定返回的受影响行的值。
在mysql中,获取受影响行的"暴力"方式似乎是:1.获取READ LOCK。2.使用UPDATE/DELETE查询的WHERE条件选择to以获取受影响的行ID。3.更新/删除。4.释放锁。
上述方式似乎效率很低。有没有一种更有效的方法可以在mysql中获取受影响的行id?
您可以创建一个触发器
从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前面都有一个逗号
sql-mysql-php-
尝试一下,它会将更新后的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);
使用@redmoon7777答案,它得到更新的ids
,并将它们Concat到uids
,但我发现列没有更新。
也许在他回答的时候,它正在更新,但它已经8年多以前了,所以我相信它可能适用于旧的MySQL版本。
但在5.7.14版本或更高版本上使用它不会更新。
因此,与他的解决方案类似,我添加了额外的条件,使列更新
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);