关键与差距的挑战?

Léo*_* 준영 4 postgresql serialization errors

我有一个触发器错误,导致在 x86_64-unknown-linux-gnu 上的 PostgreSQL 9.4.3 中出现错误,由 gcc (Debian 4.9.2-10) 4.9.2, 64 位编译。每次出错期间,SERIAL 的主键都会增加。修复错误后,表格测量结果

 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
         ...
Run Code Online (Sandbox Code Playgroud)

其中错误语句的数量为 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)
    );    
Run Code Online (Sandbox Code Playgroud)

有间隙的键有哪些挑战?

dez*_*zso 6

你看到的是完全正常和预期的

注意:由于 smallserial、serial 和 bigserial 是使用序列实现的,因此列中出现的值序列中可能存在“漏洞”或间隙,即使从未删除任何行。从序列分配的值仍然“用完”,即使包含该值的行从未成功插入到表列中。例如,如果插入事务回滚,则可能会发生这种情况。

除非您真的需要一系列无间隙的值,否则您不必担心。这就是大多数(我猜超过 99%)数据库表的工作方式。

如果你需要它,如果你在表上有并发插入要小心——你需要一些锁定来排除两个或多个并行运行的会话选择相同值的可能性。