我想在mysql中使用IF EXISTS选项删除索引,但是我找不到任何使其正常工作的方法。
DROP INDEX IF EXISTS index_name ON table_name;
有人有任何提示吗?
我想在mysql中使用IF EXISTS选项删除索引,但是我找不到任何使其正常工作的方法。
DROP INDEX IF EXISTS index_name ON table_name;
有人有任何提示吗?
我没有看到任何直接使用IF EXISTS
来DROP 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
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试试这个:
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
这是如何在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");
}
}
});