DB2:使用select插入,每个插入为每个新行递增一列?

时间:2012-02-01 13:25:09

标签: sql db2

我试图将内容从一个表中的列复制到另一个表中,同时想要为每个创建的行填充主键列的递增编号:

我尝试过以下操作:

INSERT INTO Table1 (col1, col2) VALUES((SELECT col1 FROM table2), (SELECT NEXTVAL FOR col2_SEQ FROM sysibm.sysdummy1));

但收到以下错误:

DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0348N  "NEXTVAL FOR col2_SEQ" cannot be specified in this 
context.  SQLSTATE=428F

似乎我不能以这种方式使用序列值,有没有其他方法我可以实现我想要做的事情?我只需要table1中的col2为来自table2的col1的每个新条目填充一个唯一的BIGINT

4 个答案:

答案 0 :(得分:3)

如果您使用的是Linux / Unix / Windows(可能还有其他人),我认为您只需要NEXT VALUE FOR sequence。在这种情况下,您不需要从sysdummy中额外选择。

INSERT INTO table1 (col1, col2)
    SELECT col1, NEXT VALUE FOR col2_SEQ
    FROM table2

答案 1 :(得分:1)

有三种方法可以在DB2中生成唯一值。

  1. GENERATE_UNIQUE功能
  2. IDENTITY专栏
  3. SEQUENCE object
  4. 假设col2_SEQ的创建类似于以下声明:

        CREATE SEQUENCE col2_SEQ  
        AS INTEGER  
        START WITH 1  
        INCREMENT BY 1  
        NO MINVALUE  
        NO MAXVALUE  
        NO CYCLE  
        ORDER
    

    insert语句可以写成如下:

        INSERT INTO Table1 (col1, col2)
        VALUES ((SELECT col1 FROM table2), 
             NEXT VALUE FOR col2_SEQ)
    

    有关上述三种方法的更多信息,请参见here

答案 2 :(得分:0)

也许您应该将列指定为:

col2 smallint not null 
     generated by default as identity (start with 1, increment by 1)

insert into table1 select col1, default from table2

答案 3 :(得分:0)

现在还有另一种语法,它在DB2 10.x中对我有用

INSERT INTO table1 (col1, col2)
SELECT col1, schema.seq_name.nextval
FROM table2;