是否有一种有效的方法可以从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?
答案 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);