如果表不存在,请向表添加索引

Man*_*mar 9 mysql indexing alter

我想通过使用ALTER语法向表添加索引,但首先检查它是否已存在于表中,并且仅在不存在时添加索引.

 ALTER TABLE tableName ADD INDEX IX_Table_XYZ (column1);
Run Code Online (Sandbox Code Playgroud)

有没有办法做到这一点?

Rah*_*thi 10

试试这样:

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;
Run Code Online (Sandbox Code Playgroud)

  • 这相当于“如果不存在”,这是一个非常糟糕的主意。最后,您可能会在生产中得到旧的/过时的索引定义。 (2认同)

Kay*_*son 5

您可以使用此语法检查索引(按索引名称)是否存在

SELECT 1        
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'yourschema' AND TABLE_NAME='yourtable' AND
INDEX_NAME='yourindex';
Run Code Online (Sandbox Code Playgroud)

然后你可以在存储过程中运行它,例如

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;
Run Code Online (Sandbox Code Playgroud)