Не могу создать функциональный индекс поверх своей пользовательской функции.
Я играю с функциональным индексом в 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 по созданию индекса :
Части функциональных ключей наследуют все ограничения, применимые к создаваемым столбцам. Примеры:
Для частей функционального ключа разрешены только функции, разрешенные для сгенерированных столбцов.
Подзапросы, параметры, переменные, хранимые и загружаемые функции не допускаются.
Вы просто не можете использовать свою функцию в функциональном индексе. Однако вы можете использовать выражение в теле функции непосредственно в функциональном индексе.