本地自动增量键

时间:2019-05-08 09:47:15

标签: sql postgresql auto-increment

实现在其他列“本地”的自动增量键的最佳方法是什么( ie comment,每个博客post的ID从1开始)?

例如,在GitHub上,问题编号在存储库中是本地的:问题#1意味着它是您的回购的第一期,并且不必使用更长的看似随机的ID,从而使每个人的生活更加轻松。

例如:

CREATE TABLE post (
    id     bigserial PRIMARY KEY
  , title  varchar(255) NOT NULL
);

CREATE TABLE "comment" (
    post_id    bigint REFERENCES post NOT NULL
  , id         bigint NOT NULL
  , "comment"  text NOT NULL
  , PRIMARY KEY (id, post_id)
);

解决问题的一种方法是计算给定id的所有注释的最大值post_id

INSERT INTO post (id, title) VALUES (1, 'first post');

INSERT INTO "comment" (post_id, id, "comment") VALUES (
  1,
  (SELECT COALESCE(MAX(id) + 1, 1) FROM "comment" WHERE post_id = 1 LIMIT 1),
  '1st comment of 1st post'
);

^这感觉就像是一个麻烦,我也担心可能的可序列化性问题。

我想知道(在PostgreSQL下)实现此目标的最佳方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

我会说,简单的方法就是忘记它。也就是说,创建这样的表:

create table comments (
    comment_id bigserial primary key,
    post_id bigint REFERENCES post NOT NULL,
    comment text NOT NULL
);

然后即时计算值:

create view v_comments as
    select c.*,
           row_number() over (partition by post_id order by comment_id) as post_seqnum
    from comments c;

当然,这不是一回事。例如,post_seqnum不能随时间唯一地标识每一行,因为delete可能会改变顺序。

但是,对于每一行,它仍然具有唯一的标识符,可用于此类目的。另外,还有一个单个主键列,通常更适合于外键引用和调试。