2012-03-02 3 views
1

シリアル列に番号をスキップし、
そうながら、シリアルは、各挿入のための番号をスキップし、
plzは私はこの問題を解決するのに役立ちすべてのための...
挿入 - 私は、インサートに「アンネスト」機能を使用しようとしています

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列に番号をスキップ挿入し、私はプラザにこれを解決するのに役立ち...

答えて

3

unnestはそうでそれを使用して、複数の行を返します。サイドのVALUESの1行はちょっとしたハックです。それは動作しますが、nextvalコールはどうにかして2回評価されるようです。

INSERT INTO ... VALUESではなく、INSERT INTO ... SELECT ...として挿入することができます。PostgreSQLでは、VALUESは単なる行コンストラクタです。あなたはそれが余分なIDをスキップしませんinsert ... selectのからの句にアンネスト機能を使用する場合は

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

本当にありがとうございました...あなたの素早い返信に感謝します – MAHI

1

:だから、このような何かを書くことを検討してください。

として:

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

私はあなたが推奨されないのpostgresql特定の拡張子のファウルを実行している値の句の中に入れて考えます。

現在、集合を返す関数は、クエリの選択 リストに呼び出すことができます。Postgresql Documentationはこれについて語りますクエリが単独で生成する行ごとに、戻り値セット が呼び出され、の出力行が関数の結果セットの各要素に対して生成されます。ただし、この 機能は非推奨であり、将来のリリースで削除される可能性があります。

+0

あなたの答えに感謝...それは働いた – MAHI

関連する問題