如何在Oracle中检查索引

Dou*_*oug 14 oracle metadata

我正在为依赖于Oracle数据库的产品编写模式升级脚本.在一个领域,我需要在表上创建一个索引 - 如果该索引尚不存在.有没有一种简单的方法可以检查是否存在我知道Oracle脚本名称的索引?

它与SQL Server中的类似:IF NOT EXISTS(SELECT*FROM SYSINDEXES WHERE NAME ='myIndex')//然后创建myIndex

eri*_*len 31

从user_indexes中选择count(*),其中index_name ='myIndex'

但是,sqlplus不支持IF ...所以你必须使用匿名的PL/SQL块,这意味着EXECUTE IMMEDIATE来做DDL.

DECLARE
    i INTEGER;
BEGIN
    SELECT COUNT(*) INTO i FROM user_indexes WHERE index_name = 'MYINDEX';
    IF i = 0 THEN
        EXECUTE IMMEDIATE 'CREATE INDEX myIndex ...';
    END IF;
END;
/
Run Code Online (Sandbox Code Playgroud)

编辑:正如所指出的,Oracle以非全部大写形式存储未加引号的对象名称.

  • 除非您引用它们,否则数据库对象(包括索引)都以大写形式存储。因此,如果您执行 CREATE INDEX myIndex,那么在 USER_INDEXES 中它将存储为 MYINDEX。Oracle(默认情况下)不会进行不区分大小写的匹配。 (2认同)
  • 除了这个答案之外:如果您需要检查另一个架构中是否存在索引,请查询 ALL_INDEXES 而不是使用 USER_INDEXES。检查 USER_INDEXES 不适用于“ALTER SESSION SET CURRENT_SCHEMA = XYZ”,您仍然需要查询当前登录用户的索引。 (2认同)