PostgreSQL 12中如何保留重复审批记录?是否需删除唯一约束?
问题解答
首先明确:必须删除这个唯一约束,因为你当前的需求和这个约束的核心作用完全冲突。
你之前创建的post_comment_response_approval__tm_response__uidx唯一约束,本质就是强制post_comment_response_id和team_member_id的组合在表中只能存在一条记录——这也是之前重复操作会触发ON CONFLICT更新逻辑的原因。现在要保留同一成员对同一回复的多次操作记录,意味着同一组合可以对应多条记录,这直接违反了唯一约束的规则,不删除的话根本无法实现需求。
如果想在保留操作历史的同时,避免表数据完全无约束的混乱,可以考虑这些替代方案:
- 给表新增一个自增主键字段(比如
id SERIAL PRIMARY KEY),作为每条记录的唯一标识,同时删除原来的组合唯一约束。这样同一成员对同一回复的每次操作都会生成独立的新记录。 - 如果需要保留部分约束(比如防止用户短时间内误提交重复操作),可以新增一个操作时间戳字段(比如
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP),把它加入到唯一约束中,修改为UNIQUE (post_comment_response_id, team_member_id, created_at)——但要注意,若用户在同一毫秒内多次提交仍可能触发冲突,这种场景可以搭配序列号或UUID字段来确保唯一性。
另外,原来的INSERT ... ON CONFLICT语句也需要调整,因为没有了原唯一约束,冲突处理逻辑就不需要了,直接用普通INSERT语句插入新记录即可。
内容的提问来源于stack exchange,提问作者jabepa
相关产品推荐
相关产品推荐

