现在,懒得排版了。
遇到这个问题,从A表往B表导数据,初始SQL是这样的:
- REPLACE INTO shopnc_member_extend (member_id,sell_product_count)
- SELECT ug.uid,count(uid)
- FROM uchome_goods ug
- GROUP BY ug.uid
由于member_id不是主键,于是传说中的Replace删除数据的情况就出现了(replace在更新不是主键的时候,但某数据是唯一索引时,其实它是删除该数据,再insert,这时候如果你只是更新一两个字段,那么其余的字段就会变成默认值)。所以,该方法被我否决。但因为我只要更新一个字段,所以我想着用update,开始的时候,怎么也想不出,后来卫斯文和我说,用insert ignore into吧。于是把replace into 换成了 insert ignore into进行测试,结果是0 rows affected。
怎么办,问了一下锅巴哥哥,他说:用ON DUPLICATE KEY UPDATE吧,于是到mysql官方上找了一下资料,google搜索mysq on duplicate,第一条就是官方手册,我这里就不贴链接了,但我事实上没有看太懂。。这时候卫斯文也说用ON DUPLICATE KEY UPDATE。然后给了一个例子:
- INSERT INTO music_top_filtration (`sid`, `type`, `count_num`)
- SELECT sid,TYPE,count_num
- FROM music_top_version_day20100623 AS a
- LIMIT 1
- ON DUPLICATE KEY UPDATE music_top_filtration.count_num = music_top_filtration.count_num + VALUES(count_num)
虽然功能能不太一样,但已经有点差不多了,他对此sql的解释是:sid+type 为唯一索引,如果唯一索引重复则更新count_num字段。也就是说,我上面的例子其实是可以用这个insert into来实现的,因为member_id虽然不是主键,但它是唯一索引。
然后我就尝试着写update,写出了这样的语句:
- UPDATE shopnc_member_extend as sme , uchome_goods as ug SET sme.sell_product_count = (select count(*) from uchome_goods as uug where uug.uid=sme.member_id)
- WHERE sme.member_id=ug.uid;
执行下来,没问题,只是这个花费的时间啊,超多。。。正在思考的过程中,ThinkinLamp群中的newone又给了个例子,那就是用临时表,当时他写的SQL是这样的:
- update user set roleno=(select count(*) from user_has_roles where user_has_roles.member_id=user.member_id)
- update user a, (select count(*) as no,member_id from user_has_roles group by member_id) b set a.roleno=b.no where (a.member_id=b.member_id)
- UPDATE shopnc_member_extend as sme ,( SELECT seller_id, count( * ) as cnt FROM `shopnc_product_sold` GROUP BY seller_id HAVING seller_id IS NOT NULL ) as tmp
- SET sme.sale_score = tmp.cnt
- WHERE sme.member_id = tmp.seller_id ;
其间,锅巴哥哥威胁我,要我参加他的mysql高级培训班,在此先鄙视一下。