2016-08-04 3 views
2

私はBookingモデルをDjangoに持っていて、そのIDはDjangoが作成する組み込みのidの列です。ここでは、Postgresの中で、データベースレベルでどのように見えるかです:これらの数字は連続しているように見えるが、常に連続していないことを心配なぜモデルIDはPostgres/Djangoの次のインクリメント番号ではないのですか?

integer not null default nextval('bookings_booking_id_seq'::regclass) 

クライアントは、今日まで呼びかけています。たとえば、シーケンスは次のようになります。

..2, ..3, ..4, ..6, ..8, ..9 

システムが予約を削除または削除している可能性があります。 ..5..7はどこですか?私たちは[実質的に] のすべてをに登録して予約を削除できるので、これはシステム上の問題ではないと確信しています。プログラマーの直感は、Auto-IDからの連続性を期待しないように教えてくれましたが、直感だけではクライアントへの説明には不十分です。

技術的な理由で、PostgresはこれらのIDを割り当てる際に数字をスキップしますか? postgres docsから

+2

トランザクションがロールバックされるときなどは、通常、* holes *がシーケンス内に存在する可能性があります。技術的な理由から、シーケンスはロックフリーです(そうでなければロックホットスポットまたはファンネルになる可能性があります)。 – joop

答えて

4

、smallserialシリアルおよびBIGSERIALは、配列を使用して実装されているため、行がない場合でも、列に表示される値のシーケンスにおける「穴」又は隙間が存在してもよいですこれまで削除されました。その値を含む行がテーブルの列に正常に挿入されない場合でも、シーケンスから割り当てられた値はまだ "使用されています"。これは、たとえば、挿入トランザクションがロールバックされた場合に発生する可能性があります。詳細は第9.16節のnextval()を参照してください。 nextval

のためのドキュメントから

とも同じシーケンスから数値を取得する同時実行トランザクションをブロックしないようにするには、NEXTVAL操作はロールバックされることはありません。つまり、値がフェッチされると、値は使用されたとみなされ、再び戻されません。周囲のトランザクションが後で中止された場合、または呼び出し元のクエリが値を使用しなくなった場合でも、これは当てはまります。たとえば、ON CONFLICT句を含むINSERTは、ON CONFLICTルールに従うような競合を検出する前に、必要なnextvalコールを実行することを含め、挿入されるタプルを計算します。そのような場合は、割り当てられた値のシーケンスに未使用の「穴」が残されます。したがって、PostgreSQLシーケンスオブジェクトは、 "ギャップレス"シーケンスを取得するために使用することはできません。

関連する問題