2012-02-28 109 views
3

我有以下幾列Oracle表:甲骨文唯一約束 - 混合大小寫

ID 
FUNCTION_ID 
FUNCTION_ROLE 

ID列是唯一的(序列),但我也希望兩個(FUNCTION_ID,FUNCTION_ROLE)組合也是獨一無二。

我的查詢是現象,因爲FUNCTION_ROLE是一個字符串,值可以是混合的情況下,什麼是爲了防止這種情況的發生,最好的辦法,即:

Data for this table: 
Row 1: 1,1,TEST1 
Row 2: 2,1,Test1 

我希望得到一個獨特的嘗試插入第2行爲'Test1'時的約束違反與'TEST1'相同 - 只是情況不同。

我該如何防止這種情況,因爲我正在考慮創建另一個名爲FUNCTION_ROLE_UPPER的列,並將此列與FUNCTION_ID一起用於檢查唯一性 - 這是否是正確的方法?

謝謝。

回答

10

可以實現這個使用基於函數的索引:

CREATE UNIQUE INDEX YOUR_TABLE_U1 ON YOUR_TABLE(FUNCTION_ID, UPPER(FUNCTION_ROLE)) 

在甲骨文11,你也可以考慮把UPPER(FUNCTION_ROLE)在一個虛擬列。

+0

謝謝@Branko - 理解基於函數的索引部分,但不理解虛擬列方面?你能否說明/提供例子。謝謝。 – tonyf 2012-02-28 04:31:08

+1

@tonsils除了'UPPER(FUNCTION_ROLE)'也有一個名字外,這個想法基本上是一樣的,可以被查詢,正如任何普通的列和一個_true_ UNIQUE約束都可以在它上面創建,這允許一個FOREIGN KEY引用它(這是不可能的只有一個唯一的索引)。 – 2012-02-28 04:44:22

+0

Gotcha - 謝謝你。 – tonyf 2012-02-28 04:56:19