实现在其他列“本地”的自动增量键的最佳方法是什么( 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下)实现此目标的最佳方法是什么?谢谢!
答案 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
可能会改变顺序。
但是,对于每一行,它仍然具有唯一的标识符,可用于此类目的。另外,还有一个单个主键列,通常更适合于外键引用和调试。