序列字段,跟踪主键/序列对的各个序列

时间:2011-04-24 04:36:48

标签: postgresql

我有一个用户上传对象的表格。每个用户可以拥有任意数量的对象。我希望每个对象都有一个顺序标识符,如下所示:

USERNAME    OBJECTNAME    OBJID
Kerin        cat            1
Kerin        dog            2
Narcolepsy   pie_tins       1
Kerin        mouse          3

我希望OBJID是一个序列,但是每个USERNAME字段单独跟踪序列号。我可以通过首先查询数据库并选择最高的OBJID然后将该值递增1并在我的INSERT中使用它来完成此操作,这可能很好,因为用户很难一次运行两次上传,但是查询开销和我做错的感觉让我想找到更好的方法。

1 个答案:

答案 0 :(得分:4)

如果您不需要它们是顺序的,那么您可能会在表格中添加类型为serial(或bigserial)的PK。这些数字对于每个用户名仍然是唯一的,但它实现起来很简单,你不会有UUID的丑陋。

您可以通过手动CREATE SEQUENCE调用为每个用户名创建一个序列。然后,您可以添加BEFORE INSERT trigger来设置objid,方法是确定要使用的序列,然后在其上调用nextval。如果您的用户名限制为通常的/[a-z][a-z0-9]*/模式,那么您可以将序列名称构建为“seq_objid_ username ”,触发器将能够确定使用哪个序列容易;每个用户名序列可以由用户表上的INSERT触发器创建。这种方法很有效,因为它依赖于PostgreSQL现有的事务安全序列系统。

相关问题