方法一:用identity_val_local()函数。
例如:
create table ttt
(
id int generated by default as identity,
name char(20) not null,
salary double not null
);
insert into ttt (name, salary)
values ('Bill Gates', 123.45);
insert into ttt
values (default, 'Bill Clinton', 4567.89);
values ( identity_val_local() );
该函数返回最后一次生成的Identity值。
方法二:使用sequence
在数据库中创建若干个独立的序列号发生器,并分别命名,例如:
create sequence ACCOUNT; 或
create sequence CUSTOMER as NUMERIC(15); 等等
2. 删除原有表定义中的 generated [by default ¦always] as identity 属性。
3. 在应用程序中用NEXTVAL获得每一个序列号发生器的下一个序列号,例如:
EXEC SQL insert into ttt values ( NEXTVAL FOR ACCOUNT , ......);
或
EXEC SQL values NEXTVAL FOR ACCOUNT into :acctseq;
EXEC SQL insert into ttt values ( :acctseq, ......);
4. 可以利用PREVVAL获得每一个序列号发生器的当前值(刚刚生成并使用过的值):
values PREVVAL FOR ACCOUNT into :acctseq;
但是需要注意,在一个数据库连接建立后,PREVVAL只有在调用一次NEXTVAL之后才可以使用。
5. 使用此方法可以实现在多个表之间的序列号共享。
6. 对于应用程序不关心序列号的表,仍然可以用identity字段实现。事实上,identity字段也是通过sequence实现,其对应关系可以在sysibm.syssequences表中查到。每一个identity字段由一个内部sequence名与之相对应。Identity字段与sequence的最大不同在于:identity只能在一个表中使用,多个表不可以共享identity;而sequence可以通过命名方式在同一个数据库内部的多个表中共享序列号发生器。
转自:http://hi.baidu.com/sqlercn/item/c0d2e043f4217295833ae1b2