分类: 数据库开发技术
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