如何在MySQL中使用DROP INDEX IF EXISTS?

15

我想在mysql中使用IF EXISTS选项删除索引,但是我找不到任何使其正常工作的方法。

DROP INDEX IF EXISTS index_name ON table_name;

有人有任何提示吗?


2
类似的问题:https://dev59.com/fHE95IYBdhLWcg3wDpgG - 1000111
在最近的 MySQL 版本中,这个可以工作。我刚刚尝试了一下并删除了索引。 - MP-programming
3个回答

11

我没有看到任何直接使用IF EXISTSDROP INDEX的方法。 作为解决方法,我编写了以下过程,它对我很有效。

CREATE PROCEDURE `DropIndexIfExists`(
    IN i_table_name VARCHAR(128),
    IN i_index_name VARCHAR(128)
    )
    BEGIN

    SET @tableName = i_table_name;
    SET @indexName = i_index_name;
    SET @indexExists = 0;

    SELECT 
        1
    INTO @indexExists FROM
        INFORMATION_SCHEMA.STATISTICS
    WHERE
        TABLE_NAME = @tableName
            AND INDEX_NAME = @indexName;

    SET @query = CONCAT(
        'DROP INDEX ', @indexName, ' ON ', @tableName
    );
    IF @indexExists THEN
        PREPARE stmt FROM @query;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END IF;
    END

2
你可以将 SET @query... 放在 IF 内部。挑剔一些,不然它为什么会运行呢? :p - Drew
更新多个数据库:... SELECT 1 INTO @indexExists FROM INFORMATION_SCHEMA.STATISTICS WHERE INDEX_SCHEMA = database() AND TABLE_NAME = @tableName AND INDEX_NAME = @indexName LIMIT 1; ... - asimov

7

试试这个:

create procedure DeleteIndex()
begin

IF EXISTS ( SELECT * FROM INFORMATION_SCHEMA.STATISTICS  WHERE TABLE_NAME = 'TableName'
            AND INDEX_NAME = 'IndexName' AND INDEX_SCHEMA='DbName') THEN
   ALTER TABLE  TableName DROP index THead2;
END IF;
END

-4

这是如何在Laravel中删除索引(如果存在)的方法:

Schema::table("table_name", function (Blueprint $table) {
    $indexes = DB::connection()->getDoctrineSchemaManager()->listTableIndexes("table_name");
    foreach ($indexes as $key => $val) {
        if ($key == "index_name") {
            $table->dropIndex("index_name");
        }
    }
});

OP没有标签为Laravel/PHP,只有MySQL。这个回答可能不会对OP有帮助。 - killstreet

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