如何在Postgresql中为每个用户创建顺序ID

时间:2013-09-23 15:54:43

标签: mysql sql sql-server postgresql

我正在尝试在postgresql中创建一个表来保存用户工作项。每个工作项在整个系统中都有一个唯一的ID,但是也会为该特定用户提供友好的顺序ID。

到目前为止,我一直在使用:

CREATE TABLE WorkItems
(
  Id SERIAL NOT NULL PRIMARY KEY,
  ...
);

但我不知道如何按用户划分此序列,也不知道如何使用序列划分序列。

所以我希望用户看到连续的友好ID

User1: ids = 1, 2, 3 etc..
User2: ids = 1, 2, 3, 4, 5 etc..

并且不必处理唯一的ID,但这些项目将具有1-8的唯一ID。

我看了很多,找不到关于这个主题的任何帖子。也许这很难指定和搜索?

我应该将LastWorkIdUsed存储在用户列中,然后只为其项目手动创建友好ID吗?好像我不必担心并发和事务。有没有一种简单的方法可以在生成数字时将每个用户的LastWorkIdUsed传递给Postgresql?

或者有没有办法为用户分配序列?

也许我的基本设计理念是错误的。如何在SQLServer或MySQL中执行此操作?

2 个答案:

答案 0 :(得分:2)

您说拥有全局唯一键。您可以使用它来解决并发问题。如果允许用户工作项目编号为空,则可以先创建工作项,然后执行此类操作以为其指定“友好”编号。 (T-SQL方言,@ workItemID是全局唯一ID):

Update wi
set friendlyNumber = coalesce(
    (select max(friendlyNumber)+1 from WorkItem wi2 
     where wi2.userID = wi.userID and not wi2.friendlyNumber is null)
, 1)
From WorkItem wi
where workItemID = @workItemID and friendlyNumber is null

然后找出这样的数字:

select friendlyNumber from WorkItem where workItemID = @workItemID

答案 1 :(得分:-1)

我觉得这是一个"我想要月亮"要求。

如果您能解释为什么需要这种ID,那么在为您找到解决方案时,我们会更加相关。

在我看来,您需要了解用户所处理的内容。

我的解决方案: 您是否可能犯了设计错误?

  • workitem(id_workitem)
  • user(id_user)
  • 提交(id_user,id_workitem,committed_on,comment)

所以现在,你只需加入这些表并按committed_on订购。并将(或不)编号留给您的应用。