Chinaunix首页 | 论坛 | 博客
  • 博客访问: 510733
  • 博文数量: 65
  • 博客积分: 2925
  • 博客等级: 上尉
  • 技术积分: 1306
  • 用 户 组: 普通用户
  • 注册时间: 2009-07-01 10:56
个人简介

2013

文章分类

全部博文(65)

分类: Mysql/postgreSQL

2012-09-21 17:26:31

需求:
存在一张表
 create table tmp_report 
 (
 ...
 tmp_domain varchar(20),
 report_status int
 ...
 );
 
 其中2列的值为:
 tmp_domain report_status
 a 3
 a 2
 a 1
 b 4
 希望update report_status 的值为3所对应 tmp_domain 值相同的 report_status 都改成3,即:
 tmp_domain report_status
 a 3
 a 3
 a 3
 b 4
 
 开始用以下sql报错:
 update tmp_report a set a.report_status = 3 where a.tmp_domain in 
 (select b.tmp_domain from tmp_report b where b.report_status =3);
-- ERROR 1093 (HY000): You can't specify target table 'a' for update in FROM clause
 
 
 更新:
 update 前先备份tmp_report表
 
 
方法一:
 root@localhost db1> update tmp_report a,tmp_report b set a.report_status = 3
    ->  where a.tmp_domain=b.tmp_domain and b.report_status=3;
Query OK, 2048 rows affected (11.32 sec)
Rows matched: 3072  Changed: 2048  Warnings: 0
-- 慢查询中的记录,扫描的行数大概是笛卡尔积
# Query_time: 11.318816  Lock_time: 0.000205 Rows_sent: 0  Rows_examined: 3146752
SET timestamp=1348214131;
update tmp_report a,tmp_report b set a.report_status = 3
 where a.tmp_domain=b.tmp_domain and b.report_status=3;


恢复备份表:
root@localhost db1>delete from tmp_report;
Query OK, 3072 rows affected (0.09 sec)

root@localhost db1>insert into tmp_report select * from tmp_reportbak;
Query OK, 3072 rows affected (0.12 sec)
Records: 3072  Duplicates: 0  Warnings: 0

方法二:
root@localhost db1> update tmp_report set report_status = 3 where tmp_domain in (select tmp_domain from (select tmp_domain from tmp_report where report_status =3) tmp);
Query OK, 2048 rows affected (0.15 sec)
Rows matched: 3072  Changed: 2048  Warnings: 0

对于大表的时候,这两种方法都很慢。分开语句会好很多~
阅读(2498) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~