вставить с функцией unnest - пропускает число в последовательном столбце - PullRequest
1 голос
/ 02 марта 2012

я пытаюсь использовать функцию «unnest» во вставке,
при этом серийный номер пропускает номер для каждой вставки,
Пожалуйста, помогите мне решить эту проблему ...

mydb=# \d tab1  
                         Table "public.tab1"  
 Column |  Type   |                     Modifiers                         
--------+---------+---------------------------------------------------  
 id     | integer | not null default nextval('tab1_id_seq'::regclass)  
 col1   | integer |   
 col2   | integer |   
Indexes:  
    "tab1_pkey" PRIMARY KEY, btree (id)  

mydb=# insert into tab1(id,col1,col2) values (nextval('tab1_id_seq'),1,unnest(array[4,5]));  
INSERT 0 2  
mydb=# select * from tab1;  
 id | col1 | col2   
----+------+------  
  1 |    1 |    4  
  2 |    1 |    5  
(2 rows)  

mydb=# insert into tab1(id,col1,col2) values (nextval('tab1_id_seq'),2,unnest(array[4,5]));  
INSERT 0 2  
mydb=# select * from tab1;  
 id | col1 | col2   
----+------+------  
  1 |    1 |    4  
  2 |    1 |    5  
  4 |    2 |    4  
  5 |    2 |    5  
(4 rows)  

mydb=# insert into tab1(col1,col2) values(2,unnest(array[4,5]));  
INSERT 0 2  
mydb=# select * from tab1;  
 id | col1 | col2   
----+------+------  
  1 |    1 |    4  
  2 |    1 |    5  
  4 |    2 |    4  
  5 |    2 |    5  
  7 |    2 |    4  
  8 |    2 |    5  
(6 rows)  

mydb=# insert into tab1(col2) values(unnest(array[4,5]));  
INSERT 0 2  
mydb=# select * from tab1;  
 id | col1 | col2   
----+------+------  
  1 |    1 |    4  
  2 |    1 |    5  
  4 |    2 |    4  
  5 |    2 |    5  
  7 |    2 |    4  
  8 |    2 |    5  
 10 |      |    4  
 11 |      |    5  
(8 rows)  

mydb=# select nextval('tab1_id_seq');  
 nextval   
---------  
      13  
(1 row)  

для каждой вставки пропускает число в столбце id, помогите мне решить эту проблему, плз ...

Ответы [ 2 ]

4 голосов
/ 02 марта 2012

unnest возвращает несколько строк, так что использование его внутри одной строки VALUES является чем-то вроде хака. Хотя это работает, похоже, что вызов nextval как-то оценивается дважды.

Вы можете записать вставку как INSERT INTO ... SELECT ..., а не INSERT INTO ... VALUES: в PostgreSQL VALUES - это просто конструктор строк. Так что подумайте над тем, чтобы написать что-то вроде этого:

insert into tab1(col1, col2) select 1, unnest(array[4,5])
1 голос
/ 02 марта 2012

Если вы используете функцию unnest в предложении from для insert ... select, она не пропускает дополнительные идентификаторы.

As:

insert into tab1(col1,col2)
select
   1, u.val
from
   unnest(array[4,5]) as u(val);

Я думаю, помещая ее впредложение значений вы используете как устаревшее расширение postgresql.Документация Postgresql говорит об этом:

В настоящее время функции, возвращающие наборы, также можно вызывать в списке выбора запроса.Для каждой строки, которую запрос генерирует сам по себе, вызывается функция, возвращающая набор, и выходная строка генерируется для каждого элемента набора результатов функции.Однако обратите внимание, что эта возможность устарела и может быть удалена в будущих выпусках.

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