mysql - 如果 Alter 表中的单个索引是多列索引的一部分,则不会添加它

标签 mysql indexing alter-table

到目前为止,我在存储过程中有这个:

IF NOT EXISTS(SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME= 'food'  AND (INDEX_NAME='ix_meat' OR COLUMN_NAME='meat')
    )
THEN
    CREATE INDEX ix_meat ON food (meat);
END IF; 


IF NOT EXISTS(SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME= 'food'  AND (INDEX_NAME='ix_greens' OR COLUMN_NAME='greens')
    )
THEN
    CREATE INDEX ix_greens ON food(greens);
END IF; 

食物中除主要成分外的其余成分是:

fruits, portion, gender, weight

如果这些列上没有单个索引,或者它们中的任何一个是多列索引的一部分但在右侧,例如(性别,绿色),我只想添加一个索引。为了确保单列索引不存在,我需要对该列进行行计数检查。我该如何修改这个脚本来做到这一点?

最佳答案

使用seq_in_index列来告知该列在索引中的位置。您想要添加索引,除非它是索引中的第一列。

IF NOT EXISTS(SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME= 'food'  AND (INDEX_NAME='ix_meat' OR (COLUMN_NAME='meat' AND SEQ_IN_INDEX = 1))
    )
THEN
    CREATE INDEX ix_meat ON food (meat);
END IF; 


IF NOT EXISTS(SELECT 1 FROM information_schema.statistics WHERE TABLE_SCHEMA=DATABASE()
        AND TABLE_NAME= 'food'  AND (INDEX_NAME='ix_greens' OR (COLUMN_NAME='greens' AND SEQ_IN_INDEX = 1))
    )
THEN
    CREATE INDEX ix_greens ON food(greens);
END IF; 

关于mysql - 如果 Alter 表中的单个索引是多列索引的一部分,则不会添加它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59940937/

相关文章:

javascript - 在 javascript 数组中查找 NaN 的索引

oracle - 在负载下添加具有默认值的列的最佳方法

php - MySQL有时无效的查询语法

php MySQL在嵌套div中循环

mysql - 如果 value 为 0,为什么 SELECT ... WHERE id = a 返回结果

mysql - 是否需要在 WHERE 子句中使用 INDEX 第二列?

matrix - 如何在 rpy2 中获取索引向量,或者如果不存在,我如何选择两列?

oracle - (甲骨文) : Columns in partially dropped state

MySQL ALTER 列到表中的最后一个位置

mysql - RabbitMQ 消费者 + MySQL 负载