Sql Oracle唯一约束-混合情况

Sql Oracle唯一约束-混合情况,sql,oracle,database-design,oracle11g,constraints,Sql,Oracle,Database Design,Oracle11g,Constraints,我有一个Oracle表,其中包含以下列: ID FUNCTION_ID FUNCTION_ROLE ID列是唯一的(序列),但我也希望两者(函数\ ID,函数\角色)的组合也是唯一的 但是,我的问题是,由于函数_ROLE是一个字符串,并且值可以是大小写混合的,那么防止这种情况发生的最佳方法是什么,即: Data for this table: Row 1: 1,1,TEST1 Row 2: 2,1,Test1 当尝试插入第2行时,我希望得到一个唯一的约束冲突,因为“Test1”与“Test1

我有一个Oracle表,其中包含以下列:

ID
FUNCTION_ID
FUNCTION_ROLE
ID列是唯一的(序列),但我也希望两者(函数\ ID,函数\角色)的组合也是唯一的

但是,我的问题是,由于函数_ROLE是一个字符串,并且值可以是大小写混合的,那么防止这种情况发生的最佳方法是什么,即:

Data for this table:
Row 1: 1,1,TEST1
Row 2: 2,1,Test1
当尝试插入第2行时,我希望得到一个唯一的约束冲突,因为“Test1”与“Test1”相同——只是情况不同


如何防止这种情况发生,因为我一直在考虑创建另一个名为FUNCTION\u ROLE\u UPPER的列,并使用此列和FUNCTION\u ID检查唯一性——这是正确的方法吗?

您可以使用基于函数的索引来实现这一点:

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

在Oracle 11下,您也可以考虑在虚拟列中放置<代码>上(函数-角色)< /代码>。谢谢@ Brangk-理解基于函数的索引部分,但不理解虚拟列方面?你能解释/提供例子吗。谢谢。@扁桃体这个想法基本上是一样的,除了

UPPER(FUNCTION\u ROLE)
还有一个名称,可以像任何普通列一样进行查询,并且可以在它上面创建一个真正的唯一约束,允许外键引用它(仅使用唯一索引是不可能的)。