我有一个用户上传对象的表格。每个用户可以拥有任意数量的对象。我希望每个对象都有一个顺序标识符,如下所示:
USERNAME OBJECTNAME OBJID
Kerin cat 1
Kerin dog 2
Narcolepsy pie_tins 1
Kerin mouse 3
我希望OBJID是一个序列,但是每个USERNAME字段单独跟踪序列号。我可以通过首先查询数据库并选择最高的OBJID然后将该值递增1并在我的INSERT中使用它来完成此操作,这可能很好,因为用户很难一次运行两次上传,但是查询开销和我做错的感觉让我想找到更好的方法。
答案 0 :(得分:4)
如果您不需要它们是顺序的,那么您可能会在表格中添加类型为serial
(或bigserial
)的PK。这些数字对于每个用户名仍然是唯一的,但它实现起来很简单,你不会有UUID的丑陋。
您可以通过手动CREATE SEQUENCE调用为每个用户名创建一个序列。然后,您可以添加BEFORE INSERT trigger来设置objid
,方法是确定要使用的序列,然后在其上调用nextval
。如果您的用户名限制为通常的/[a-z][a-z0-9]*/
模式,那么您可以将序列名称构建为“seq_objid_ username ”,触发器将能够确定使用哪个序列容易;每个用户名序列可以由用户表上的INSERT触发器创建。这种方法很有效,因为它依赖于PostgreSQL现有的事务安全序列系统。