我使用以下语句生成主键。表2保留了当前的主键。但是它太慢了。我怎样才能优化这个过程。
update table1 t set ID =ROW_NUMBER() OVER ();
update table1 t
set ID = (Select NUMGEN.currentvalue + ID from table1 data, table2 NUMGEN
where NUMGEN.tablename = 'table1' and t.Id = data.ID );
为什么要这样做主键。为什么您需要动态生成/修改自己的id值?
如果您需要为表生成唯一的id,请创建一个序列并在表中使用该序列值。例如:
CREATE SEQUENCE <schema>.SEQ_SAMPLE_TABLE DATA TYPE BIGINT INCREMENT BY 1 NO ORDER NO CYCLE MINVALUE 100 MAXVALUE 9223372036854775807 CACHE 20;
以获得一个唯一的序列用作主键。
然后创建一个以ID为主键的表:
CREATE TABLE <schema>.SAMPLE_TABLE (
STATUS_ID BIGINT DEFAULT NULL ,
STATUS_DESC VARCHAR(80) DEFAULT NULL ,
CONSTRAINT <schema>.XPK_STATUS PRIMARY KEY( STATUS_ID ) );
然后插入一行,你可以:
insert into SAMPLE_TABLE (nextval for SEQ_SAMPLE_TABLE, 'This is working');
其中大部分可以来自db2手册。
例如:创建表:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0000927.htm
创建序列:http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0004201.htm
编辑:我应该补充一下——以上就是我们在我当前客户身上的做法。另一种方法(也许更好)是:
CREATE TABLE WIDGET_INVENT
( ROW_ID INT NOT NULL GENERATED ALWAYS AS IDENTITY
(START WITH 1, INCREMENT BY 1, NO CACHE),
WIDGET_NO CHAR(6),
INV_COUNT INT WITH DEFAULT 0
);
其中不从外部指定序列,而是将它们构建到表定义中。在这种情况下,在执行插入操作时,完全不要引用row_id列。例如,请参见此处:http://www.ibm.com/developerworks/data/library/techarticle/0205pilaka/0205pilaka2.html
第一种方法是指定自己的序列,部分是这样做的,因为它们是如何将一些表从一个环境迁移到下一个环境的。序列从具有不同起始值的不同源映射出来,从而可以轻松地合并数据。YMMV