web-dev-qa-db-ja.com

ギャップのあるキーの課題?

トリガーに誤りがあり、gcc(Debian 4.9.2-10)4.9.2、64ビットでコンパイルされたx86_64-unknown-linux-gnu上のPostgreSQL 9.4.3でエラーが発生しました。エラーが発生するたびに、SERIALの主キーが増加しました。バグを修正した後、表measurements

 measurement_id | measurement_size_in_bytes |             time              
----------------+---------------------------+-------------------------------
              1 |                     77777 | 2015-07-14 18:29:56.858703+03
              2 |                       888 | 2015-07-14 18:29:56.882552+03
              3 |                       888 | 2015-07-14 18:30:15.505957+03
              4 |                       888 | 2015-07-14 18:41:01.878106+03
             39 |                     77777 | 2015-07-15 12:11:21.21391+03
             40 |                     77777 | 2015-07-15 12:11:59.551973+03
             41 |                     77777 | 2015-07-15 12:12:05.48982+03
             42 |                     77777 | 2015-07-15 12:13:02.402053+03
             43 |                     77777 | 2015-07-15 12:13:02.419412+03
             44 |                       888 | 2015-07-15 12:13:02.434728+03
         ...

エラーステートメントの数は35(= 39-4)です。このIDの急上昇は、順序が重要な部分インデックスとこのテーブルを統合するときに、後で困難になる可能性があります。

テーブル

CREATE TABLE measurements
    (
        measurement_id SERIAL PRIMARY KEY NOT NULL,
        measurement_size_in_bytes INTEGER NOT NULL,
        time TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT CURRENT_TIMESTAMP,
        CONSTRAINT no_duplicate_measurements UNIQUE (time)
    );    

ギャップのあるキーの課題は何ですか?

あなたが見るものは完全に 通常であり期待される です。

:smallserial、serial、bigserialはシーケンスを使用して実装されているため、列に表示される値のシーケンスに「穴」またはギャップがある場合があります。行が削除されていなくても。シーケンスから割り当てられた値は、その値を含む行がテーブルの列に正常に挿入されなかった場合でも、「使い果たされ」ます。これは、たとえば、挿入トランザクションがロールバックした場合に発生する可能性があります。

ギャップのない一連の値が本当に必要でない限り、それについて心配する必要はありません。これがほとんど(99%以上)のデータベーステーブルの動作方法です。

必要な場合は、テーブルに同時挿入がある場合は注意してください。複数のセッションが並行して実行されている場合に同じ値を選択する可能性を排除するには、ロックが必要です。

6
dezso