Не могу создать функциональный индекс поверх своей пользовательской функции.

Я играю с функциональным индексом в MySQL 8 и использую базу данных *employees*.

Итак, я создал эту функцию:

      DELIMITER $$
CREATE FUNCTION salary_range2(salary DECIMAL(10,2))
    RETURNS INT
    DETERMINISTIC
    READS SQL DATA
BEGIN
    RETURN CASE
               WHEN salary < 40000 THEN 1
               WHEN salary < 80000 THEN 2
               WHEN salary < 120000 THEN 3
               ELSE 4
        END;
END$$
DELIMITER ;

И это утверждение терпит неудачу:

CREATE INDEX idx_salary_range ON salaries (( salary_range2(salary)));

Ошибка: [HY000][3758] Выражение функционального индекса «idx_salary_range» содержит запрещенную функцию.

Я сомневался, была ли функция детерминированной или нет, но, похоже, проблема не в этом, поскольку детерминированная подпись не проверяется MySQL. И, кстати, мне кажется детерминированным.

Я что-то пропустил ? Или какой-либо обходной путь этой проблемы, например создание временного столбца, представлений или таблицы? Но мне было интересно поэкспериментировать с некоторыми функциональными индексами из руководств Hello World.

Я попытался создать функциональный индекс с помощью своей собственной пользовательской функции, но у меня возникла ошибка [HY000][3758]. Выражение функционального индекса «idx_salary_range» содержит запрещенную функцию.

1 ответ

Как говорится в документации MySQL по созданию индекса :

Части функциональных ключей наследуют все ограничения, применимые к создаваемым столбцам. Примеры:

Для частей функционального ключа разрешены только функции, разрешенные для сгенерированных столбцов.

Подзапросы, параметры, переменные, хранимые и загружаемые функции не допускаются.

Вы просто не можете использовать свою функцию в функциональном индексе. Однако вы можете использовать выражение в теле функции непосредственно в функциональном индексе.

Другие вопросы по тегам