2012-02-02 20 views
31

が、私はpostgresの中に、以下の表を持って挿入します。ただし、この場合、テーブルの自動インクリメントポインタは更新されません。したがって、私はエラーを取得する第三のインサートに:Postgresの自動インクリメントは

ERROR: duplicate key value violates unique constraint "test_pkey" 
DETAIL: Key (id)=(1) already exists. 

私は、MyISAMテーブルとINNODBエンジンの両方にMySQLでこの問題に直面したことはありません。明示的かどうかにかかわらず、mysqlは最大行IDに基づいて常にautoincrementポインタを更新します。

ポストグルでこの問題の回避策を教えてください。私はテーブルの中のいくつかのIDのためのより厳密なコントロールが必要なので、それが必要です。

更新日: 固定値のIDが必要な値がいくつかあるので、必要です。他の新しいエントリについては、私は新しいものを作成する気にしない。

私はそれは私が明示的にIDを挿入していたときに、手動でmax(id) + 1nextvalポインタをインクリメントすることにより可能かもしれないと思います。しかし、私はそれをどうやって行うのか分かりません。

答えて

53

これは正常に動作するはずです。next_val('test_id_seq')は、システムがこの列の値を必要としていて、それを提供していない場合にのみ呼び出されます。値を指定しないと、そのような呼び出しは実行されず、その結果、シーケンスは「更新」されません。

あなたが明示的に与えられた値を使用して、最後の挿入後に手動でsettingによってこれを回避シーケンスの値を仕事ができる:それをやったmilen-ラデフ、1感謝@

SELECT setval('test_id_seq', (SELECT MAX(id) from "test")); 
+1

! – jerrymouse

+1

奇妙な動作。私はMySQLからも来ています。ありがとうございました! –

+0

私は同じ問題を抱え、あなたとhttp://www.ruby-forum.com/topic/64428#72333(あなたは基本的に同じことを言う)と私の問題を解決しました。ありがとう。 – marsol0x