注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL9.1 新特性之二: Writeable Common Table Expressions  

2011-09-14 15:43:55|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

      
       PostgreSQL9.1 的这个特性可以重新利用数据更新(/Delete/Insert/Update)的结果集,
并做进一步的处理,解释起来比较困难,先看看下面的例子。      
      
一 测试场景一:备份删除的数据
--1 创建测试表
mydb=> create table test_1 (id integer, name varchar(32));
CREATE TABLE

mydb=> insert into test_1 values (1,'a'),(2,'b'),(3,'c');
INSERT 0 3

mydb=> create table test_1_bak as select * from test_1 where 1=2;
SELECT 0

mydb=> select * From test_1;
 id | name
----+------
  1 | a
  2 | b
  3 | c
(3 rows)

mydb=> select * from test_1_bak;
 id | name
----+------
(0 rows)

--2 删除表 test_1 数据,并将删除的数据备份在表 test_1_bak
mydb=> WITH deleted as (delete from test_1 where id=1 returning id,name)
mydb-> insert into test_1_bak select * From deleted;
INSERT 0 1

mydb=> select * from test_1;
 id | name
----+------
  2 | b
  3 | c
(2 rows)

mydb=> select * from test_1_bak;
 id | name
----+------
  1 | a
(1 row)

       备注:这个功能可以使用的历史数据归档上,比如删除上月数据时,可以将删除的数据归档
                  到历史表上,节省操作步骤,提升效率。
            

二 测试场景二:删除数据之后,显示已删除的数据;
mydb=>  WITH test_1_deleted as (delete from test_1 where id=2 returning *)
mydb->  select * from test_1_deleted;
 id | name
----+------
  2 | b
(1 row)

mydb=> select * from test_1;
 id | name
----+------
  3 | c
(1 row)

      备注:这个功能可以应用在清理数据时,将日志打出,确保删除的数据无误。当然,
                 如果删除的数据量比较大,这点就不提倡了。
           
           
三 测试场景三:更复杂的逻辑   

       可以将稍复杂的业务逻辑放在一个SQL里实现,简化步骤,提高效率,如下所示;
     
mydb=> insert into test_1 select generate_series(4,10),'c';
INSERT 0 7

mydb=> select * from test_1;
 id | name
----+------
  3 | c
  4 | c
  5 | c
  6 | c
  7 | c
  8 | c
  9 | c
 10 | c
(8 rows) 

mydb=> create table test_2 (id integer , name varchar(32));
CREATE TABLE

mydb=> insert into test_2 select generate_series(1,10000),'AAA';
INSERT 0 10000

mydb=> select * From test_2 limit 3;
 id | name
----+------
  1 | AAA
  2 | AAA
  3 | AAA

mydb=>   WITH test_1_deleted as (delete from test_1 where id<7 returning *)  ,   
mydb->        delete_count as (select count(*) as total from test_1_deleted)
mydb->  update test_2
mydb->  set name='this is a test'
mydb->  from delete_count d
mydb->  where id=d.total;
UPDATE 1

mydb=> select * From test_2 where name='this is a test';
 id |      name     
----+----------------
  4 | this is a test
 

  评论这张
 
阅读(25971)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016