Chinaunix首页 | 论坛 | 博客
  • 博客访问: 134417
  • 博文数量: 37
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 375
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-13 17:31
文章分类

全部博文(37)

文章存档

2011年(1)

2010年(9)

2009年(27)

我的朋友

分类: 数据库开发技术

2009-10-10 18:50:19

Identity Columns 系统自带的识别字段。

1、建立一个递增系列
CREATE        MULTISET TABLE dwptemp.identity_column (
 ID INT TITLE 'ID' GENERATED BY DEFAULT AS IDENTITY ( START
WITH        0 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999 NO CYCLE ),
name varchar(10)) primary index(name);

insert into  dwptemp.identity_column (name) values('e')
;insert into  dwptemp.identity_column (name) values('f')
;insert into  dwptemp.identity_column (name) values('g')
;insert into  dwptemp.identity_column (name) values('h')

select * from dwptemp.identity_column;
result:

ID      NAME
1        f
0        e
3        h
2        g


2、建立另外一个递增系列,同identity_column
CREATE        MULTISET TABLE dwptemp.identity_column_bk (
 ID INT TITLE 'ID' GENERATED BY DEFAULT AS IDENTITY ( START
WITH        0 INCREMENT BY 1 MINVALUE 1 MAXVALUE 999999999 NO CYCLE ),
name varchar(10)) primary index(name);

insert into dwptemp.identity_column_bk(name) select name from dwptemp.identity_column;

select * from dwptemp.identity_column_bk;

result:

ID                NAME
0                  f
100,000        e
200,000        h
300,000        g

3、2个递增系列就插入的方式不同,一个只直接一个个row插入,一个是批量的,就出来系统赋值的字段的不同。

因为:当一个个row插进去的时候,计算identity column的是在PE缓存中,所以对于同一个PE,出来的递增系列是相连的。当批量插入的时候,计算identity column是在AMP缓存中,每个AMP自己独立管理,一般默认AMP之间的起始值相差100000,所以就出来跳100000的结果。

还有种情况在一个个row插进去的时候也会有跳跃,就是系统重启,PE缓存没了,就会出现跳跃。

4、如何得出直接递增不跳跃的字段呢?
   解决方案:
   使用row_number();

  SEL  name,CAST((ROW_NUMBER() OVER (PARTITION BY  1 ORDER BY  1)) AS VARCHAR(10))
FROM dwptemp.identity_column;

 使用csum();
 SEL  name,csum(1,name)
FROM dwptemp.identity_column
 


 

阅读(954) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~