2012-03-02 64 views
1

我试图使用插入“UNNEST”功能,
而这样做,序列跳过了一些对每个插入,
plz帮助我解决这个...
插入与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列中的数字,帮我解决这个PLZ ...

回答

3

unnest返回多行,所以用它一边VALUES单行是一个黑客。虽然它确实有效,但似乎nextval调用以某种方式评估了两次。

你可以写一个插入为INSERT INTO ... SELECT ...而不是INSERT INTO ... VALUES:在PostgreSQL中,VALUES只是一个行构造函数。因此,考虑写这样的事情:

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

感谢它真的不错...感谢您的快速回复 – MAHI 2012-03-02 08:42:35

1

如果从子句的insert ... select它不会跳过额外的标识使用UNNEST函数中。

由于:

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

我认为把它在您运行的是过时的PostgreSQL特定扩展名的犯规值条款。该Postgresql Documentation说一下:

目前,返回集合的函数也可以在一个查询的选择列表 叫。对于该查询自己生成的每一行, 函数返回集被调用,以及用于 产生输出行的函数的结果集的每个元素。但是请注意,这 能力已被弃用,并可能在以后的版本中删除。

+0

感谢你的答案...它的工作 – MAHI 2012-03-02 08:46:15