问题描述
我在 postgres 中有一个 POSTS 表,其架构如下所示
create table posts(postid int,postname VARCHAR(255) NOT NULL,createdby VARCHAR(255) NOT NULL,PRIMARY KEY (postname),CONSTRAINT fk_user FOREIGN KEY(createdby) REFERENCES users(username) on DELETE CASCADE);
也许是一个菜鸟问题,但我不希望 postid 总是由用户设置,我希望它对用户来说是增量的。 比如说,我有 2 个用户,每个用户都在添加 2 个帖子,
所以我想将它存储在数据库中
postid. postname. createdby
1 hi user1
2 second user1
1 hi user2
2 second user2
这样的事情是否可以让 postid 自动递增而我不必以这种方式插入它?
即 postid 和 name 可以与不同的用户相似
解决方法
create table posts(
postid int,postname VARCHAR(255) NOT NULL,createdby VARCHAR(255) NOT NULL,PRIMARY KEY (postname));
create function tgf_posts_bi() returns trigger language plpgsql
as $$
declare
seq_name text;
begin
seq_name := format('seq_posts_%s',new.createdby);
execute format('create sequence if not exists %I start with 1',seq_name);
new.postid := nextval((quote_ident(seq_name))::regclass);
return new;
end $$;
create trigger tg_posts_bi
before insert on posts
for each row execute procedure tgf_posts_bi();
insert into posts(postname,createdby) values
('foo','John'),('bar','Jack Daniel'),('baz',('win',('amp',('M$ media mplayer','Mary');
table posts;
postid | postname | createdby
-----: | :--------------- | :----------
1 | foo | John
1 | bar | Jack Daniel
2 | baz | Jack Daniel
2 | win | John
3 | amp | John
1 | M$ media mplayer | Mary
,
我不是 100% 确定您的问题,这可能过于简单化了,但据我所知,您只需要每个帖子/用户一条记录。如果是这种情况,您的主键应该是 postname
和 createdby
字段,这将保证每个用户/帖子只有一条记录:
create table posts (
postid int,constraint posts_pk PRIMARY KEY (postname,createdby),CONSTRAINT fk_user FOREIGN KEY(createdby) REFERENCES users(username) on DELETE CASCADE
);
然后,当你插入时,你想做一个 upsert,而不是一个普通的插入。这表示如果不存在则插入记录;否则更新它:
insert into posts (postid,postname,createdby)
values (1,'hi','user1')
on conflict on constraint posts_pk
do
update
set
postid = posts.postid + 1
我不禁觉得问题陈述中缺少一些东西,但从我收集的信息来看,我希望这会有所帮助。