如何在MySQL中创建或删除索引时使用"if exists"?

Pau*_*aul 55 php mysql indexing

我想知道是否有一种方法可以在创建索引或在MySQL上销毁索引之前检查索引是否存在.几年前似乎有一个功能请求,但我找不到任何解决方案的文档.这需要在使用MDB2的PHP应用程序中完成.

Nik*_*l S 49

这是我的4班轮:

set @exist := (select count(*) from information_schema.statistics where table_name = 'table' and index_name = 'index' and table_schema = database());
set @sqlstmt := if( @exist > 0, 'select ''INFO: Index already exists.''', 'create index i_index on tablename ( columnname )');
PREPARE stmt FROM @sqlstmt;
EXECUTE stmt;
Run Code Online (Sandbox Code Playgroud)

  • 正如有人谁加载多个数据库具有相同的架构,我想补充到WHERE上的第一行:"AND TABLE_SCHEMA = DATABASE()" (4认同)
  • @VenerableAgents,我刚编辑了包含它的答案.救了我的命... :) (2认同)

Pab*_*ino 25

IF EXISTS修饰符不是为DROP INDEXCREATE INDEX尚未构建的.但您可以在创建/删除索引之前手动检查是否存在.

使用此句来检查索引是否已存在.

SHOW INDEX FROM table_name WHERE KEY_NAME = 'index_name'
Run Code Online (Sandbox Code Playgroud)
  • 如果查询返回零(0),那么索引不存在,那么您可以创建它.
  • 如果查询返回正数,则索引存在,则可以删除它.

  • @PabloVenturino可以在SQL语句中"以编程方式"检查吗? (2认同)

Dat*_*eek 13

这是一个DROP INDEX IF EXISTS程序:

DELIMITER $$

DROP PROCEDURE IF EXISTS drop_index_if_exists $$
CREATE PROCEDURE drop_index_if_exists(in theTable varchar(128), in theIndexName varchar(128) )
BEGIN
 IF((SELECT COUNT(*) AS index_exists FROM information_schema.statistics WHERE TABLE_SCHEMA = DATABASE() and table_name =
theTable AND index_name = theIndexName) > 0) THEN
   SET @s = CONCAT('DROP INDEX ' , theIndexName , ' ON ' , theTable);
   PREPARE stmt FROM @s;
   EXECUTE stmt;
 END IF;
END $$

DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

此代码是基于此处的过程创建的:在创建之前确定MySQL表索引是否存在