2013-09-23 30 views
1

我試圖在postgresql中創建一個表來保存用戶工作項目。每個工作項目在整個系統中都有一個唯一的ID,但是對於該特定用戶也會有一個友好的順序ID。如何在Postgresql中爲每個用戶創建順序ID

到目前爲止,我一直只使用:

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

,但我不知道如何劃分該系列每用戶,也不知道怎樣與序列做到這一點無論是。

所以我想爲用戶看到連續友好IDS

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

,而不是必須處理的唯一ID,但這些項目都具有唯一的ID爲1-8。

我環顧四周相當多,無法找到關於這一主題的文章。也許這只是很難指定和搜索?

我應該存儲在LastWorkIdUsed用戶欄,然後只需手工創建一個友好的ID爲自己的項目?似乎我不必擔心併發和交易。生成數字時,是否有簡單的方法將每個用戶的LastWorkIdUsed傳遞給Postgresql?

還是有指定的順序給用戶的方法是什麼?

也許我的基本設計理念錯了。如何在SQLServer或MySQL中執行此操作?

+0

你必須執行SELECT語句檢索工作項的MAX值WHERE用戶是指定的用戶。然後將1添加到它,這將成爲您的新用戶/工作項目編號。 –

+2

有沒有這樣的事情作爲一個友好的ID。如果用戶看到身份證號碼,我保證他們不會關心他們是否順序。 –

+1

@RobertHarvey:你忘了所有的表鎖定廢話,這是需要的方法工作。除非一次不會有多個連接到數據庫,所以您不必擔心競爭狀況。 –

回答

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