ORA-01502: 此类索引的索引或分区处于可用状态问题

ber*_*d_k 8 oracle-11g bulkcopy

我的 Oracle 数据库中有一个表,其中

select pkcol, count(*) from myTable group by pkcol having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)

产量

  PKCOL   COUNT(*)
------- ----------
      1          2
      2          2
Run Code Online (Sandbox Code Playgroud)

试图删除重复的行

delete myTable where pkcol = 1;
Run Code Online (Sandbox Code Playgroud)

产量:

ORA-01502: 索引“MYTABLE.PK_MT”或此类索引的分区处于可用状态。

我正在使用 Oracle.DataAccess.Client.OracleBulkCopy 来填充表格。

据我了解,必须检查Oracle PRIMARY KEY 约束的文档。

显然它们没有被检查,正如我通过连续两次执行相同的批量复制而发现的,这些批量复制以所有行中的重复结束。

现在我只在删除所有行后才使用它,并且我正在使用一个具有类似主键的表作为源。因此,我预计不会有任何问题。

但是深深嵌入到我的 MS Build 脚本中,我最终在 2210 行中只有 2 个重复。

我想首先忽略主键是一个明显的错误。不允许批量复制忽略主键约束。

编辑:

同时我发现,在调用bulkcopy之前,通常由某个脚本插入的2个冲突行。问题归结为我的已知问题,bulkcopy 不会在这里检查主键。

Fro*_*y Z 10

遇到了类似的问题。

如果您只需要摆脱错误,请执行以下操作:

SELECT 'ALTER INDEX '||OWNER||'.'||INDEX_NAME||' REBUILD;'
FROM DBA_INDEXES
WHERE STATUS = 'UNUSABLE';
Run Code Online (Sandbox Code Playgroud)

这将输出ALTER INDEX ... REBUILD;所有“不可用”索引的语句。运行它们,以便索引可以再次“可用”。


Jac*_*las 6

您链接到文档中

在加载结束时重建索引时会验证 UNIQUE 约束。如果索引违反了 UNIQUE 约束,它就会处于索引不可用状态。

他们以我的方式阅读它,同样适用于PRIMARY KEY约束,尽管措辞有点含糊不清。您可能不喜欢这种行为,但它不是“错误”,因为它的行为符合设计 - 还有其他方法可以结束这种“破坏”的约束。

这OTN职位的更多信息和方法可能会更好地工作,你使用PL / SQL和forall ... save exceptions