2012-03-02 29 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