插入不需要的功能 - 跳过串行列中的数字

时间:2012-03-02 07:08:05

标签: arrays function postgresql auto-increment

我试图在插入中使用“不需要”的功能,
这样做时,串口会跳过每个插入的数字,
请帮助我解决这个问题......

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 个答案:

答案 0 :(得分:3)

unnest返回多行,因此在VALUES的单行中使用它有点像黑客。虽然它确实有效,但似乎nextval调用以某种方式进行了两次评估。

您可以将插入编写为INSERT INTO ... SELECT ...而不是INSERT INTO ... VALUES:在PostgreSQL中,VALUES只是一个行构造函数。所以考虑写下这样的东西:

insert into tab1(col1, col2) select 1, unnest(array[4,5])

答案 1 :(得分:1)

如果您使用insert ... select的from子句中的不需要的函数,则不会跳过额外的ID。

如:

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

我认为通过将它放在一个值子句中,你正在运行一个已弃用的postgresql特定扩展。 Postgresql Documentation说明了这一点:

  

目前,还可以在select中调用返回集的函数   查询列表。对于查询自己生成的每一行,   调用函数返回集,并为其生成输出行   函数结果集的每个元素。但请注意这一点   功能已弃用,可能会在将来的版本中删除。