首先我简述一下用到这种情况的场景:
需求:需要随机修改某张表中的一条数据,再用这条数据中某个字段的值做其它操作,所以我要拿到被修改这条数据的某个字段的值
在请求量少的情况下,可以用程序生成随机数,再进行其它操作
若请求量较多,程序生成随机数后再操作即不可行,这样做很容易重复操作数据
这种时候的解决方案,可以直接到数据库中进行随机修改,然后拿到已修改数据的主键(或其它字段),再进行其它操作,这样就避免了重复操作数据。
那怎样获取已修改数据的标示呢?用Mysql的变量即可,如下:
SET @update_id := 0;
UPDATE some_table SET row = 'value', id = (SELECT @update_id := id)
WHERE some_other_row = 'blah' LIMIT 1;
SELECT @update_id;
大致思路是:首先声明一个用户变量 @update_id ,之后在update修改数据时要多更新一个字段,就是将当前主键值更新为当前主键值(其实就是没更新),更新主键值并不是目的,只是为了将当前主键值赋值给@update_id,就是这句:SELECT @update_id := id
如果更新了多条记录也可以用下面的方式:
SET @uids := null;
UPDATE footable
SET foo = 'bar'
WHERE fooid > 5
AND ( SELECT @uids := CONCAT_WS(',', fooid, @uids) );
SELECT @uids;
注:上面的方法不适用于有HAVING、GROUP BY或者ORDER BY子句中,否则可能出入与预期不同的结果。