如何在Oracle中检查索引

19

我正在为依赖于Oracle数据库的产品编写模式升级脚本。在某个区域,我需要在一个表上创建索引,但前提是该索引不存在。在Oracle脚本中是否有一种简单的方法来检查我已知名称的索引是否存在?

类似于SQL Server中的以下代码: 如果(SELECT * FROM SYSINDEXES WHERE NAME = 'myIndex')不存在 // 然后创建myIndex

1个回答

39

从user_indexes表中查询索引名称为'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;
/

编辑:正如指出的那样,Oracle将未加引号的对象名称存储为全部大写。


2
除非您使用引号引用它们,否则数据库对象(包括索引)将以大写形式存储。因此,如果您执行CREATE INDEX myIndex,则在USER_INDEXES中它将被存储为MYINDEX。而Oracle(默认情况下)不会进行大小写不敏感的匹配。 - Gary Myers
2
仅作为补充,如果您需要检查另一个模式中是否存在索引,请查询ALL_INDEXES而不是使用USER_INDEXES。使用USER_INDEXES进行检查无法与“ALTER SESSION SET CURRENT_SCHEMA = XYZ”一起使用,因为您仍将查询当前登录用户的索引。 - SaschaM78

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接