2011-04-24 25 views
3

我有一張用戶上傳的對象表。每個用戶可以有任意數量的對象。我希望每個對象有一系列的標識符,像這樣:序列字段,跟蹤主鍵/序列對的單個序列

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

我想爲OBJID是一個序列,但每個用戶名字段單獨跟蹤序列號。我可以通過首先查詢數據庫並選擇最高的OBJID,然後將該值遞增1並在INSERT中使用它來完成此操作,這可能很好,因爲用戶很難一次運行兩次上載,但是查詢開銷和我做錯的感覺讓我想找到更好的方法。

+0

首先,主鍵必須是唯一的,所以用戶名不是你的。其次,你需要什麼樣的東西你的OBJID? – 2011-04-24 05:03:55

+0

當我說主關鍵詞時,我顯然比我想象的更疲倦。該帖子已被編輯。 OBJID將被用來明確地引用對象,但現在我試圖回答這個問題,我不再確定爲什麼標識符必須是順序的 - 我正在檢查是否有任何東西會傷害字段一個簡單的UUID。 – 2011-04-24 05:11:28

+0

如果你不需要它們是連續的,那麼你可能會逃避在表中添加一個'serial'類型的PK(或'bigserial')。這些數字仍然是唯一的每個用戶名,但它實現起來很簡單,你不會有UUID的醜陋。 – 2011-04-24 05:16:26

回答

4

如果你不需要它們是連續的,那麼你可能會在表中添加一個serial(或bigserial)PK。這些數字仍然是唯一的每個用戶名,但它實現起來很簡單,你不會有UUID的醜陋。

您可以通過手動CREATE SEQUENCE調用爲每個用戶名創建一個序列。然後,您可以添加一個BEFORE INSERT trigger來設置objid,方法是確定要使用哪個序列,然後調用nextval。如果您的用戶名限制爲通常的/[a-z][a-z0-9]*/模式,那麼您可以將序列名稱構建爲類似「seq_objid_ 用戶名」的類似名稱,並且觸發器可以很容易地確定要使用哪個序列;每個用戶名序列可以通過用戶表上的INSERT觸發器創建。這種方法將起作用,因爲它依賴於PostgreSQL現有的事務安全序列系統,所以它會很安全。