如果索引存在,如何删除索引?
看起来很简单,但我确实在网上找到了什么。 这个想法只有在它存在的情况下才会删除它,因为如果不存在,我将会出错并且我的进程会停止。
我发现这是为了查找索引是否存在:
select index_name
from user_indexes
where table_name = 'myTable'
and index_name='myIndexName'
但我不知道怎么把它和
放在一起DROP INDEX myIndexName
答案 0 :(得分:59)
不检查是否存在。如有必要,尝试删除并捕获异常......
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;
/
答案 1 :(得分:29)
DECLARE
COUNT_INDEXES INTEGER;
BEGIN
SELECT COUNT(*) INTO COUNT_INDEXES
FROM USER_INDEXES
WHERE INDEX_NAME = 'myIndexName';
IF COUNT_INDEXES > 0 THEN
EXECUTE IMMEDIATE 'DROP INDEX myIndexName';
END IF;
END;
/
答案 2 :(得分:2)
在Oracle中,您不能混合使用DDL和DML。为此,您需要使用EXECUTE IMMEDIATE语句来处理它。
因此,首先检查索引是否存在。
其次,通过EXECUTE IMMEDIATE语句删除索引。
DECLARE v_Exists NUMBER;
BEGIN
v_Exists := 0;
SELECT 1 INTO v_Exists
FROM USER_INDEXES
WHERE TABLE_NAME LIKE 'myTable'
AND INDEX_NAME LIKE 'myIndexName'
IF v_Exists = 1 THEN
EXECUTE IMMEDIATE "DROP INDEX myIndexName"
ENDIF;
EXCEPTION
WHEN OTHERS THEN
NULL;
END;
这段代码不在我的脑海中,您可能需要稍微修改一下,但这给了我一个想法。
希望这有帮助! =)
答案 3 :(得分:0)
我制作了一个程序,因此可以多次调用:
DELIMITER €€
DROP PROCEDURE IF EXISTS ClearIndex€€
CREATE PROCEDURE ClearIndex(IN var_index VARCHAR(255),IN var_table VARCHAR(255))
BEGIN
SET @temp = concat('DROP INDEX ', var_index, ' ON ', var_table);
PREPARE stm1 FROM @temp;
BEGIN
DECLARE CONTINUE HANDLER FOR 1091 SELECT concat('Index ', var_index,' did not exist in ',var_table,', but was handled') AS 'INFO';
EXECUTE stm1;
END;
END €€
DELIMITER ;
现在可以多次调用它:
CALL ClearIndex('employees_no_index','employees');
CALL ClearIndex('salaries_no_index','salaries');
CALL ClearIndex('titles_no_index','titles');
答案 4 :(得分:0)
我希望这会有所帮助。这是所有解决方案的组合:) 顺便感谢你的帮助!
CREATE OR REPLACE PROCEDURE CLEAR_INDEX(INDEX_NAME IN VARCHAR2) AS
BEGIN
EXECUTE IMMEDIATE 'drop index ' || INDEX_NAME;
EXCEPTION
WHEN OTHERS THEN
NULL;
END CLEAR_INDEX;