我正在制作一个简单的笔记应用程序,我想创建一个表来跟踪笔记的编辑历史记录,并使用递增版本将它们保存为带有笔记 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 的版本 有没有办法自动执行此操作?我看过其他一些帖子,并尝试了触发器和功能,但我还没有能够让任何东西发挥作用。非常感谢任何建议!
请记住,使用这种方法时,必须在表中搜索每个插入,因此最好有一个索引来加快速度: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 |
您需要制定自己的规则,规定如果有人进来并删除或更新表中的某些内容该怎么办,或者记住不要依赖版本序列的连续性。