D:/>db2 connect to test user cwgladm using cwglpass
数据库连接信息
数据库服务器 = DB2/NT 8.2.9
SQL 授权标识 = CWGLADM
本地数据库别名 = TEST
D:/>db2 select char(TABSCHEMA,20),char(TABNAME,30),char(COLNAME,20),GENERATED from syscat.columns where IDENTITY='Y'
1 2 3 GENERATED
-------------------- ------------------------------ -------------------- ---------
0 条记录已选择。
D:/>db2 create table t1(id bigint not null generated by default as identity ^
More? (start with 1,increment by 1) primary key, ^
More? name varchar(10))
DB20000I SQL 命令成功完成。
D:/>db2 create table t2(id bigint not null generated always as identity ^
More? (start with 1,increment by 1) primary key, ^
More? name varchar(10))
DB20000I SQL 命令成功完成。
D:/>db2 select char(TABSCHEMA,20),char(TABNAME,30),char(COLNAME,20),GENERATED from syscat.columns where IDENTITY='Y'
1 2 3 GENERATED
-------------------- ------------------------------ -------------------- ---------
CWGLADM T1 ID D
CWGLADM T2 ID A
2 条记录已选择。
下面分别对这两种类型的标识列做试验,对于generated by default
D:/>
D:/>db2 insert into t1 (name) values('id1'),('id2') -- 可以自动生成标识列的值 注意此时标识列的下一个值为3
DB20000I SQL 命令成功完成。
D:/>db2 select * from t1
ID NAME
-------------------- ----------
1 id1
2 id2
2 条记录已选择。
D:/>db2 insert into t1 values(4,'id4'),(5,'id5') -- 也可以手工输入标识列的值
DB20000I SQL 命令成功完成。
D:/>db2 select * from t1
ID NAME
-------------------- ----------
1 id1
2 id2
4 id4
5 id5
4 条记录已选择。
小结:
自增列有两种类型:generated by default、generated always
相同点:1、即使插入语句失败,标识列仍然自增
2、都可以重置起始值,语句:alter table [table_name] alter [col_name] restart with [x]
不同点:generated by default:可以修改,手工指定标识列的值。
generated always :不可修改,只能由系统生成。
注意事项:
1、因上述标识列的特性在数据迁移时要特别小心处理!
要仔细分析导入数据与目标库表里的标识列的当前值,以免主键冲突;
如果改变导入数据的标识列,更要考虑导入表子表外键同步更新,所以要研究透彻再动手。
generated by default ... ,该约束性弱,允许重置起始值,在导入数据时注意重新设置目标表的自增列的起始值,
如自增列不连续,就麻烦了,要分段设置导数据,恶梦...
generated always ...约束性强,其值只允许系统根据其定义自动生成,在导入数据时,可以根据实际情况重置起始值后,
再指定"忽略"选项,即modified by IDENTITYIGNORE。 补充:
identityignore 选项还是由系统根据标识列的定义自动生成。应该用LOAD程序的identityoverride选项来导入文件里的内容,
而不是有系统生成这些值,主要是外键关系的影响。