我正在尝试在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中执行此操作?
答案 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,那么在为您找到解决方案时,我们会更加相关。
在我看来,您需要了解用户所处理的内容。
我的解决方案: 您是否可能犯了设计错误?
所以现在,你只需加入这些表并按committed_on订购。并将(或不)编号留给您的应用。