Mysql 如果Alter table中的单个索引是多列索引的一部分,则不会添加该索引
到目前为止,我在一个存储过程中使用了以下内容:Mysql 如果Alter table中的单个索引是多列索引的一部分,则不会添加该索引,mysql,indexing,alter-table,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 I
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;
食品中除主要成分外的其他成分包括:
水果、份量、性别、重量
如果这些列上没有单独的索引,或者其中任何一个是多列索引的一部分,但在右侧(如性别、绿色),我只想添加一个索引。为了确保单个列索引不存在,我需要对该列进行行计数检查。如何修改此脚本以实现此目的?使用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;
我不明白这个问题。您的查询不区分单列索引和多列索引。它只是检查该列是否在任何索引中。请注意,如果您希望只测试绿色的查询使用该索引,它必须是索引中的第一列。所以你应该检查seq_in_index=1。是的,这是我关于如何区分单列和多列索引的问题,现在我只检查任何一个。我尝试了两个堆栈外的东西,但都不起作用。如果已经有一个单列索引,为什么要添加索引?它肯定不允许这样做。如果该列上没有单个索引,或者该列是多列索引的一部分,但位于右侧(如性别、绿色),我只想添加单个索引