2013-04-22 62 views
0

我想創建一個包含操作的獨特PostgreSQL索引。有誰知道這是否可能?創建包含操作的唯一PostgreSQL索引

CREATE UNIQUE INDEX ux_data ON table (name, color) 

,我想要添加的操作是「NUM & new_num = 0」,其中num是現有的列和new_num要被插入的值。

這可能嗎?

更新:下面是關於我想要做的更多細節。

數據庫:

name color num 
one  red  5 
two  green 5 
one  red  8 

我想要做的是防止在一個條目是不是唯一的,就像這樣:

的新條目1:名稱=一個,顏色=紅色,NUM = 1.

我們有匹配的名稱和顏色,在101 & 001 = 1開始的num檢查結果,該新條目1不是唯一的,但是並應拒絕,如果該號碼已更改爲2

新條目2:name = one,color = red,num = 2

現在我們有匹配的名稱和顏色。對於所有名稱/顏色匹配中的數字101 & 010 = 0和1000 & 0010 = 0,所以我們有一個唯一的條目。

+2

這聽起來更像是一個檢查約束而不是索引。 – 2013-04-22 21:52:15

+0

如果可以使用檢查約束來完成,我也會這樣做。我只是不知道是否可以檢查。就像這樣:CREATE UNIQUE INDEX ux_ft ON base.ft(ft_date DESC,ft_num,sq)WHERE(ver = true);,除了在db中檢查傳入值與值之外。 – 2013-04-22 22:38:29

+1

請澄清你的問題。很難猜到你在做什麼。如果您找不到描述意圖的正確術語,請添加一個測試用例。 – 2013-04-23 00:08:08

回答

0

這將是一個項目和一半。它看起來並不像有一個非常簡單的方法來做到這一點,但使用PostgreSQL,任何事情都是可能的。我想你想要一個使用GIST的排除約束。不幸的是,排除約束並不是一件容易的事情,因爲沒有簡單的類型支持它。

您的基本解決方案,我認爲將不得不涉及:

  1. 強制轉換爲合適的數據類型(大概位(N))

  2. 足夠的運營商允許位的GiST索引(N)。這意味着您必須爲所有GiST操作類建立功能和操作員,創建操作員系列等。

  3. 使用您的操作創建排除約束。

這並不容易,它會很複雜,但有一些努力和奉獻是可能的。我希望有一兩百行代碼可以參與其中。你可能也想寫單元測試。

相關問題