arc*_*eta 11 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?
Amr*_*mro 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)
Run Code Online (Sandbox Code Playgroud)
请注意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';
Run Code Online (Sandbox Code Playgroud)
这将返回已删除的ID,每个ID前面都有一个字符串中的逗号
试试这个,它会将更新后的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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8473 次 |
| 最近记录: |