【问题标题】:out of line sql index creation issue Oracle离线sql索引创建问题Oracle
【发布时间】:2016-08-16 00:23:45
【问题描述】:

谁能解释一下语法有什么问题。我想添加约束主键和唯一但也想使用相同的索引(复合索引)。

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.

感谢您的回答。

【问题讨论】:

  • 为什么val1, val2 上的索引适合对val2 实施唯一约束?你能按相反的顺序定义val_index吗?

标签: sql oracle indexing


【解决方案1】:

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

为什么您仍然觉得需要指定索引?为什么不直接使用:

contraint unq_table_val2 unique(val2)

【讨论】:

    【解决方案2】:

    为了强制执行主键或唯一性约束,Oracle 使用索引。

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

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

    但是,要使索引可用,索引的前导列需要包含所有约束中定义的列。

    所以在你的情况下,如果你有一个索引定义为:

    create index val_index on val(val1,val2)
    

    ...它可用于在val1 上强制执行主键,因为val1 是索引中的前导列。

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

    另一方面,如果您在 (val1, val2)(val2, val1) 上定义了唯一约束,这两种组合都可以成功使用索引,因为它们都被 前导 列索引(索引的第 1 列和第 2 列)。当然,同时拥有这两个约束是多余的,所以这样做没有意义。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-02
      • 1970-01-01
      相关资源
      最近更新 更多