【问题标题】:Local Auto-Increment Key本地自动递增键
【发布时间】:2019-09-26 00:23:42
【问题描述】:

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

例如,在 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)
);

解决问题的一种方法是计算给定post_id 的所有 cmets 的最大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 下)?谢谢!

【问题讨论】:

  • 我喜欢这个问题。但是,我必须说,PK 并不意味着可见或“性感”。它们的目的是确保行的唯一性。话虽如此,我仍然认为需要顺序编号。辅助“可见”列可能有用,尽管它的值可能以延迟方式计算。
  • “辅助“可见”列可能有用,但它的值可能以延迟方式计算。”确实,但是怎么做? =)

标签: sql postgresql auto-increment


【解决方案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 可能会改变顺序。

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

【讨论】:

  • 我认为这是一个非常好的答案,但正如您所提到的,删除可能会改变顺序(如果我们允许通过其 ID 引用对象 [如 GitHub 问题],这是不可取的)。
  • @BoraM.Alper 。 . .如果有问题,您可以使用软删除。
猜你喜欢
  • 1970-01-01
  • 2013-09-28
  • 2016-09-06
  • 2017-02-10
  • 2018-11-23
  • 2019-08-07
  • 2016-04-22
  • 2011-01-25
  • 1970-01-01
相关资源
最近更新 更多