2012-03-02 4 views
1

그렇게하는 동안, 시리얼은 각 삽입의 번호를 건너 뜁니다
,
는 PLZ이 문제를 해결하는 데 도움이 시리얼 컬럼에 숫자를 건너 뜁니다 ... 모든, 그것은 id 컬럼에 숫자를 건너 뜁니다 삽입 나를 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) 

...

답변

3

unnest 반환 여러 행, 그래서 그것을 사용 측면의 한 행 VALUES은 해킹 비트입니다. 작동하지만, nextval 호출은 어떻게 든 두 번 평가됩니다.

INSERT INTO ... VALUES이 아닌 INSERT INTO ... SELECT ...으로 삽입을 작성할 수 있습니다. PostgreSQL에서 VALUES은 단지 행 생성자입니다. 그래서 이런 식으로 뭔가를 쓰는 고려해

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

답장을 보내 주셔서 감사합니다. 빠른 답변 주셔서 감사합니다. – MAHI

1

를 당신이 여분의 ID를 생략하지 않는 insert ... select의 절에서의 unnest 기능을 사용하는 경우.

으로는 :

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

난 당신이 사용되지 않는 PostgreSQL을 특정 확장자의 파울을 실행하는 VALUES 절에 넣어 생각합니다. Postgresql Documentation 이것에 대해 말한다 :

현재 함수는 반환 세트도 쿼리의 선택 목록에 호출 할 수 있습니다. 쿼리가 자체적으로 생성하는 각 행에 대해 집합을 반환하는 함수가 호출되고 출력 행이 함수 결과 집합의 각 요소 에 대해 생성됩니다. 그러나이 기능은 더 이상 사용되지 않으며 이후 릴리스에서 제거 될 수 있습니다.

+0

답변 해 주셔서 감사합니다. – MAHI

관련 문제