DB2: Вставить в с помощью select, увеличивая столбец для каждой новой строки на одну для каждой вставки? - PullRequest
4 голосов
/ 01 февраля 2012

Я пытаюсь скопировать содержимое из столбца в одной таблице в другую и в то же время хочу заполнить столбец первичного ключа увеличивающимся числом для каждой созданной строки:

Я попытался сделать следующее:

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

Кажется, что я не могу использовать значение последовательности таким образом, есть ли другой способ, которым я могу достичь того, что япытаешься сделать?Мне просто нужно, чтобы col2 в table1 заполнялся уникальным BIGINT для каждой новой записи из col1 из table2

Ответы [ 4 ]

3 голосов
/ 01 февраля 2012

Если вы работаете в Linux / Unix / Windows (и, возможно, для других), я думаю, вы просто хотите NEXT VALUE FOR sequence. В этом контексте вам не нужен дополнительный выбор из sysdummy.

INSERT INTO table1 (col1, col2)
    SELECT col1, NEXT VALUE FOR col2_SEQ
    FROM table2
1 голос
/ 08 февраля 2012

Существует 3 метода, в которых можно генерировать уникальные значения в DB2.

  1. GENERATE_UNIQUE функция
  2. IDENTITY столбец
  3. SEQUENCE объект

Предполагается, что col2_SEQ создан аналогично приведенному ниже утверждению:

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

Оператор вставки может быть записан следующим образом:

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

Более подробную информацию о каждом из трех упомянутых выше методов можно найти здесь

0 голосов
/ 26 июня 2018

Существует также альтернативный синтаксис, который работал для меня в DB2 10.x

INSERT INTO table1 (col1, col2)
SELECT col1, schema.seq_name.nextval
FROM table2;
0 голосов
/ 03 февраля 2012

Может быть, вы должны указать столбцы как:

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

и insert into table1 select col1, default from table2

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...