为用户名设置唯一的 id

问题描述

我在 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       

demo

,

我不是 100% 确定您的问题,这可能过于简单化了,但据我所知,您只需要每个帖子/用户一条记录。如果是这种情况,您的主键应该是 postnamecreatedby 字段,这将保证每个用户/帖子只有一条记录:

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

我不禁觉得问题陈述中缺少一些东西,但从我收集的信息来看,我希望这会有所帮助。