oracle drop index如果存在

CC.*_*CC. 27 oracle indexing

如果索引存在,你如何删除索引?

看起来很简单,但我确实在网上找到了什么.这个想法只有在它存在时才删除它,因为如果不存在,我将会出错并且我的进程停止.

我发现这是为了查找索引是否存在:

select index_name
from user_indexes
where table_name = 'myTable'
and index_name='myIndexName'
Run Code Online (Sandbox Code Playgroud)

但我不知道怎么把它放在一起

DROP INDEX myIndexName
Run Code Online (Sandbox Code Playgroud)

Sam*_*uel 61

不要检查是否存在.如有必要,尝试删除并捕获异常...

DECLARE
   index_not_exists EXCEPTION;
   PRAGMA EXCEPTION_INIT (index_not_exists, -1418);
BEGIN
   EXECUTE IMMEDIATE 'drop index foo';
EXCEPTION
   WHEN index_not_exists
   THEN
      NULL;
END;
/
Run Code Online (Sandbox Code Playgroud)

  • @ jpmc26接受的答案有竞争条件.索引可能在检查计数的行和执行立即数之间被删除. (5认同)
  • 除了可以将“ COUNT”替换为“ EXISTS”以外,这还具有公认的答案有什么优势? (2认同)
  • 欢迎来到多线程世界。:(好答案+1 (2认同)

Ult*_*mit 29

DECLARE
   COUNT_INDEXES   INTEGER;
BEGIN
   SELECT COUNT ( * )
     INTO COUNT_INDEXES
     FROM USER_INDEXES
    WHERE INDEX_NAME = 'myIndexName';
   -- Edited by UltraCommit, October 1st, 2019
   -- Accepted answer has a race condition.
   -- The index could have been dropped between the line that checks the count
   -- and the execute immediate
   IF COUNT_INDEXES > 0
   THEN
      EXECUTE IMMEDIATE 'DROP INDEX myIndexName';
   END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)

  • 当然,"DROP INDEX"*已经*检查了索引的存在,所以你现在要做两次. (3认同)