Отдельный индекс в таблице Alter не будет добавлен, если он входит в состав индекса из нескольких столбцов. - PullRequest
0 голосов
/ 28 января 2020

У меня пока есть это в хранимой процедуре:

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; 

Остальные столбцы в пище, кроме основного:

фрукты, порция, пол, вес

Я хочу добавить только один индекс, если в этих столбцах нет одного индекса или если какой-либо из них является частью индекса из нескольких столбцов, но с правой стороны, например (пол, зеленые). Чтобы убедиться, что индекс одного столбца еще не существует, мне нужно включить проверку количества строк в этом столбце. Как мне изменить этот скрипт для этого?

1 Ответ

1 голос
/ 28 января 2020

Используйте столбец 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; 
...