2016-08-16 63 views
0

有人可以解释我语法有什么问题。我想添加约束主键和唯一的,但也想使用相同的索引(复合索引)。Out of line sql索引创建问题Oracle

create table val (
val1 number, val2 number, 
constraint val_pk primary key(val1) using index(create index val_index on val(val1,val2)), 
constraint val_unique unique (val2) using index val_index); 

它给我一个错误

create table val (
val1 number, val2 number, 
constraint val_pk primary key(val1) using index(create index val_index on val(val1,val2)), 
constraint val_unique unique (val2) using index val_index) 
Error report - 
SQL Error: ORA-14196: Specified index cannot be used to enforce the constraint. 
14196. 00000 - "Specified index cannot be used to enforce the constraint." 
*Cause: The index specified to enforce the constraint is unsuitable 
      for the purpose. 
*Action: Specify a suitable index or allow one to be built automatically. 

感谢您的答案。

+1

为什么'val1,val2'上的索引适合对'val2'强制执行一个唯一的约束?你能否以相反的顺序定义'val_index'? –

回答

0

要强制实施主键或唯一约束,Oracle使用索引。

默认情况下,如果合适的索引不存在,Oracle将自动创建一个唯一的索引,其索引与约束定义相同,顺序相同。

但是,Oracle也能够使用非唯一索引,并且列不需要与约束中的列相同。

然而,对于索引为可用,该指数的领先列需要包括在约束定义的所有列。

你的情况

所以,如果你有一个指数定义为:

create index val_index on val(val1,val2) 

...它可以用于强制val1主键,因为val1领先列该指数。

但它不能用于强制执行val2上的唯一约束,因为val2是索引中的第2列。

在另一方面,你(val1, val2)(val2, val1)定义的唯一约束,这两个组合可以成功地使用了索引,因为它们都涵盖了指数的领先列(第1和索引的第二栏)。当然,有两个限制是多余的,所以这样做没有意义。

在你的情况下,在2个不同的列上具有基本上2个不同的唯一约束将需要至少2个索引。您将无法使用单个索引强制执行这两个约束。

1

错误信息非常清楚。 val2上的唯一条件不能由(val1, val2)上的复合索引强制执行。

为什么你觉得有必要指定索引呢?为什么不使用:

contraint unq_table_val2 unique(val2)