4

postgresql に問題があると思いますが、postgresql にバグがあると思います。何かを間違って実装しています。

colmn1(primary key)colmn2(unique)colmn3、 ...を含む表があります。

行を挿入した後、既存のcolmn2値を使用して別の挿入を試みると、予想どおり重複値エラーが発生します。しかし、この失敗した試行の後、colmn1の次の値は 1 ずつ増加しますが、挿入はありません1,2,4,6,9.(3,5,6,7,8

この奇妙な振る舞いを説明できる人の助けが必要です。

この情報は役に立つかもしれません: " create unique index on tableName (lower(column1))" クエリを使用して一意の制約を設定しました。

4

2 に答える 2

9

PostgreSQL シーケンス FAQを参照してください。

シーケンスは、一意の識別子を生成することを目的としています。厳密に連続した識別子である必要はありません。2 つの同時データベース クライアントが両方とも (nextval() を使用して) シーケンスから値を取得しようとすると、各クライアントは異なるシーケンス値を取得します。その後、これらのクライアントのいずれかがトランザクションを中止すると、そのクライアント用に生成されたシーケンス値が使用されなくなり、シーケンスにギャップが生じます。

これは、重大なパフォーマンスの低下を招かずに簡単に修正することはできません。詳細については、General Bits Newsletterの Elein Mustein の「主キーのギャップレス シーケンス」を参照してください。

于 2012-09-14T11:06:00.397 に答える
3

マニュアルから:

重要: シーケンスは非トランザクションであるため、setval によって行われた変更は、トランザクションがロールバックされても取り消されません。

つまり、ギャップがあるのは正常です。ギャップが必要ない場合は、シーケンスを使用しないでください。

于 2012-09-14T12:44:52.990 に答える