31 votos

¿Cómo puedo emplear "si existe" para crear o eliminar un índice en MySQL?

Me preguntaba si hay alguna forma de comprobar si existe un índice antes de crearlo o destruirlo en MySQL. Parece que hubo una solicitud de características para esto hace unos años, pero no puedo encontrar ninguna documentación para una solución. Esto necesita hacerse en una aplicación PHP usando MDB2.

21voto

Nikhil S Puntos 432

Aquí está mi 4 liner:

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;

17voto

Pablo Venturino Puntos 1660

IF EXISTS El modificador no está construido para DROP INDEX o CREATE INDEX todavía. Pero puedes comprobar manualmente la existencia antes de crear o dejar caer un índice.

Utilice esta frase para comprobar si el índice ya existe.

SHOW INDEX FROM table_name WHERE KEY_NAME = 'index_name'
  • Si la consulta devuelve cero (0) entonces el índice no existe, entonces puedes crearlo.
  • Si la consulta devuelve un número positivo, entonces el índice existe, entonces puedes dejarlo.

8voto

Datageek Puntos 2846

Aquí hay un procedimiento de ÍNDICE DE CAÍDA SI EXISTE:

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 ;

Este código fue creado basado en el procedimiento de aquí: Determinar si el índice de la tabla MySQL existe antes de crear

0voto

MJB Puntos 5096

No está incorporado

Sin embargo,

http://old.nabble.com/how-to-%22drop-index-if-exists%22-td14024229.html

explica cómo escribir un procedimiento almacenado para implementar DROP INDEX IF EXISTS, y parece bastante fácil modificar este código para que funcione para implementar CREATE INDEX IF EXISTS

0voto

Wim Deblauwe Puntos 2570

Tenía problemas con algunas de las soluciones presentadas aquí. Esto es lo que se me ocurrió:

DELIMITER $$

DROP PROCEDURE IF EXISTS myschema.create_index_if_not_exists $$
CREATE PROCEDURE myschema.create_index_if_not_exists(in p_tableName VARCHAR(128), in p_indexName VARCHAR(128), in p_columnName VARCHAR(128) )
BEGIN

PREPARE stmt FROM 'SELECT @indexCount := COUNT(1) from information_schema.statistics WHERE `table_name` = ? AND `index_name` = ?';
SET @table_name = p_tableName;
SET @index_name = p_indexName;
EXECUTE stmt USING @table_name, @index_name;
DEALLOCATE PREPARE stmt;

-- select @indexCount;

IF( @indexCount = 0 ) THEN
  SELECT 'Creating index';
  SET @createIndexStmt = CONCAT('CREATE INDEX ', p_indexName, ' ON ', p_tableName, ' ( ', p_columnName ,')');
  PREPARE stmt FROM @createIndexStmt;
  EXECUTE stmt;
  DEALLOCATE PREPARE stmt;
END IF;

END $$

DELIMITER ;

Úsalo de la siguiente manera:

call myschema.create_index_if_not_exists('MyTable','end_time_index','end_time');

Esto fue probado en MAC OS X 10.8.2 con MySQL 5.5.24 y en Windows 7 con MySQL 5.5.21

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X