如何在DB2中生成主键(SQL优化)

  • 本文关键字:SQL 优化 DB2 sql db2 primary-key
  • 更新时间 :
  • 英文 :


我使用以下语句生成主键。表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

最新更新