如何自动增加postgres复合主键的一列?

问题描述 投票:0回答:1

我正在制作一个简单的笔记应用程序,我想创建一个表来跟踪笔记的编辑历史记录,并使用递增版本将它们保存为带有笔记 ID 的复合键。例如:

note_id | version | content
----------------------------
    1   |    1    | some_text
    1   |    2    | some_text 
    2   |    1    | some_text
    2   |    2    | some_text 
    1   |    3    | some_text 
    3   |    1    | some_text 
    1   |    4    | some_text 

复合键由 note_id 和 version 组成 我想增加每个 note_id 的版本 有没有办法自动执行此操作?我看过其他一些帖子,并尝试了触发器和功能,但我还没有能够让任何东西发挥作用。非常感谢任何建议!

postgresql composite-primary-key database-sequence
1个回答
0
投票

请记住,使用这种方法时,必须在表中搜索每个插入,因此最好有一个索引来加快速度:demo

create index on notes (note_id,version);

create function tgf_notes_version() returns trigger language plpgsql as $f$
begin 
  NEW.version=(select coalesce(max(version),0)+1 
               from notes n
               where n.note_id=NEW.note_id );
  return NEW;
end $f$;

create trigger tg_a_gen before insert on notes
for each row execute function tgf_notes_version();

现在您可以在版本列中插入任何内容,触发器将处理它:

insert into notes values 
  (1,999,'my_own_text11'), 
  (1,999,'my_own_text12'), 
  (3,123,'my_own_text31'), 
  (3,321,'my_own_text32'), 
  (3,0,'my_own_text33')
returning *;
note_id 版本 内容
1 1 我自己的文本11
1 2 我自己的文本12
3 1 我自己的文本31
3 2 我自己的文本32
3 3 我自己的文本33

您需要制定自己的规则,规定如果有人进来并删除或更新表中的某些内容该怎么办,或者记住不要依赖版本序列的连续性。

© www.soinside.com 2019 - 2024. All rights reserved.