Mysql 如果表不存在索引,则将其添加到表中

Mysql 如果表不存在索引,则将其添加到表中,mysql,indexing,alter,Mysql,Indexing,Alter,我想使用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' an

我想使用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;

根据@kaynlson的回答,对我来说,在MySQL 5.7.16中正确的方法是使用IS NULL而不是=1处于IF状态

因此,有条件地向表中添加索引的代码段是:

如果选择1 来自'INFORMATION\u SCHEMA`.'统计信息` 其中'TABLE_SCHEMA`='yourschema' 和'TABLE_NAME`='yourtable' 而'INDEX\u NAME`='yourindex'则为空 ALTER TABLE`yourtable`添加索引`yourindex``column1`ASC; 如果结束;
这是最好的答案@RahulTripathi解除分配stmt需要它吗?何时适用?@kaynlson:-不需要取消分配。如果我们使用像游标这样的东西,它基本上是被使用的。您可以引用:它说:准备好的语句特定于创建它的会话。如果终止会话而不取消分配先前准备的语句,则服务器将取消分配该语句a@KayNelson很高兴我也帮助了你!谢谢,但是这可以不用存储过程来完成吗?是的,只需在开始中执行它。。。结束发言。我总是预选SP,因为这样您就可以在不关闭软件的情况下更改生产环境中的逻辑。@Kaynlson我如何使用字段执行此操作?