简记update碰到的一个小问题

今天在使用mysql 的update的时候碰到了这么个麻烦的问题,,简记之。

问题起因:

我要给一张已经存在老用户数据的表增加一个字段,该表为充值表,目前已有字段为:

红色的字段是我要添加上去的,用来标识用户的本次充值是否为第一次充值,其实这个字段不加上也无所谓,根据pay_time 和user_id其实就可以作sql查询来统计相关功能了,但是为了以后统计的方便,我还是倾向于加上这么一个明了的字段。

因此,我就得给已经存在于数据库的所有记录来作判断,判断该条记录是否是该用户的首次充值。

于是我毫不犹豫,挥毫写下了这么一个sql:

UPDATE t_user_pay SET is_first = 1 WHERE pay_index in(select pay.pay_index FROM t_user_pay as pay, (SELECT pay_index, MIN(pay_time) as m_time from t_user_pay GROUP BY user_id) as bWHERE pay.pay_time = b.m_time);

这个SQL 也很容易理解,最里面一层查询出user_id 以及它对应的第一次充值时间

第二层查询出所有第一次充值的pay_index,然后由于pay_index是主键,因此在最外层使用update将pay_index所对应的is_first字段置为 1,由此完成了我们的需求。

结果,悲剧了,mysql爆出了这么一个错误:

很简单,update语句里面的查询条件不能是即将要被update的表。

原因就不分析了,这是mysql的内部机制。

那么,在朋友的帮助下,使用了另外一个方法,既然不能直接update是嘛,那好办,我把select查询出来之后的数据作临时保存,然后再进行update,这样由于查询条件不在原表了,这样总没问题了吧?

SQL如下:

drop table if exists temp_pay ;create TEMPORARY TABLE temp_pay(pay_index BIGINT);insert into temp_pay(pay_index)select a.pay_indexfrom t_user_pay as a,(select user_id,min(pay_time) min_time from t_user_pay group by user_id) as bwhere a.user_id = b.user_id and a.pay_time=b.min_time;update t_user_pay set is_first=1where pay_index in(select pay_index from temp_pay);drop table if exists temp_pay ;

ok了,

执行成功。

不过这样的方式效率不高,我暂时没有想到其他更好的办法,暂时记录之。

而它的种子,就是它生命的延续,继续承受风,

简记update碰到的一个小问题

相关文章:

你感兴趣的文章:

标签云: