【问题标题】:Wierd behavior with unusable index - oracle索引不可用的奇怪行为 - oracle
【发布时间】:2012-12-13 12:57:45
【问题描述】:

我确实有一个很大的迁移过程,在这种情况下,它试图将一行插入一个具有主键约束和唯一索引的表中。在插入约束之前禁用(与 SQL 开发人员检查)并且索引被标记为不可用(与 SQL 开发人员再次检查)。但是在插入的时候还是会报错

01502. 00000 -  "index '%s.%s' or partition of such index is in unusable state"

所以我想尝试从 SQL 开发人员手动执行查询,结果仍然相同。我什至明确尝试设置会话(和系统)跳过这样的不可用索引

BEGIN
EXECUTE IMMEDIATE 'ALTER SESSION SET SKIP_UNUSABLE_INDEXES = TRUE';
single row insert line
END;

但仍然是同样的错误。我的理解是,如果禁用约束;索引不可用,我们跳过我们应该能够插入的不可用索引。这是对的吗?我在这里错过了一些非常琐碎的事情吗?任何建议/帮助表示赞赏。

PS:Oracle 11.2.0.1.0

【问题讨论】:

  • 如果您确实禁用了 PK 和所有唯一约束,而不仅仅是将相关索引标记为不可用,您应该能够做到这一点。您检查了什么来验证所有唯一/pk 约束均已禁用?
  • 在 sql developer 中显示了一个列,表示这些约束已禁用。

标签: oracle indexing


【解决方案1】:

如果索引不是唯一的,您可以设置 SKIP_UNUSABLE_INDEXES = true 并且它应该可以工作。 但是,在您的情况下,由于索引是唯一的,我认为您不能这样做。

http://docs.oracle.com/cd/B28359_01/server.111/b28320/initparams229.htm

【讨论】:

  • 是的,更好的做法是创建一个非唯一索引来支持唯一约束——可以禁用该约束并且索引可以保持可用或不可用。
  • 谢谢!你会碰巧知道以前版本的 oracle 中的行为是否不同吗? 10 点?
【解决方案2】:

为所有主键不可用的行创建一个代理键。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-29
    • 2016-03-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多