我想使用ALTER
语法为表添加索引,但首先要检查它是否已经存在于表中,如果不存在才添加索引。
ALTER TABLE tableName ADD INDEX IX_Table_XYZ (column1);
有没有办法做到这一点?
尝试像这样:
set @x := (select count(*) from information_schema.statistics where table_name = 'table' and index_name = 'IX_Table_XYZ' and table_schema = database());
set @sql := if( @x > 0, 'select ''Index exists.''', 'Alter Table TableName ADD Index IX_Table_XYZ (column1);');
PREPARE stmt FROM @sql;
EXECUTE stmt;
SELECT 1
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'yourschema' AND TABLE_NAME='yourtable' AND
INDEX_NAME='yourindex';
然后您可以在存储过程中运行它,例如:
IF (SELECT 1
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'yourschema' AND TABLE_NAME='yourtable' AND
INDEX_NAME='yourindex') != 1 THEN
Alter Table TableName ADD Index IX_Table_XYZ (column1);
END IF;
BEGIN ... END
语句中执行它。我总是更喜欢使用存储过程,因为这样您可以在生产环境中更改逻辑而无需关闭软件。 - Mad Dog Tannen根据@KayNelson的回答,在MySQL 5.7.16中,正确的方法是在IF
条件中使用IS NULL
而不是!=1
。
因此,一段用于有条件地向表添加INDEX
的代码片段如下:
IF (SELECT 1
FROM `INFORMATION_SCHEMA`.`STATISTICS`
WHERE `TABLE_SCHEMA` = 'yourschema'
AND `TABLE_NAME` = 'yourtable'
AND `INDEX_NAME` = 'yourindex') IS NULL THEN
ALTER TABLE `yourtable` ADD INDEX `yourindex` (`column1` ASC);
END IF;
SHOW INDEX FROM yourTableName WHERE Key_name = 'yourTableIndexName'
。如果结果集不为空,则索引已经存在。
IF NOT EXISTS
,但这是一个非常糟糕的想法。最终你可能会在生产环境中得到一个旧的/过时的索引定义。 - The Impaler