Нет функции по умолчанию, о которой я знаю, чтобы делать то, что вы хотите.
Я думаю, вам придется выполнить некоторые проверки с использованием индекса ENUM. Значения ENUM отображаются в числовой индекс. Вы можете выбрать column_name + 0 в столбце ENUM, и это даст вам значение индекса ENUM, а не значение ENUM. MySQL ENUM Doc
В вашем случае индекс ENUM будет выглядеть примерно так:
NULL -> NULL
0 -> ''
1 -> '9:00'
2 -> '9:30'
3 -> '10:00'
Например, если у вас есть 1 запись с временным интервалом, установленным в «9:00», и вы «ВЫБЕРИТЕ интервал времени + 0 из таблицы», ваш результат для записи будет равен 1. Если значение столбца было «9:30», индекс будет 2 и т. д.
Вы можете найти потенциальный индекс входящего значения, используя что-то вроде этого:
SELECT FIND_IN_SET('new_value', REPLACE(SUBSTRING(column_type,6, LENGTH(column_type) - 6), '\'', '') ) AS enum_options
FROM information_schema.columns
WHERE column_name='your_enum_column'
AND table_schema = 'your_schema';
Если результат этого равен любому из значений индекса (или значения индекса +1) любого из значений, уже имеющихся в таблице, вы не хотите разрешать эту новую запись. Вы можете использовать вышеупомянутый запрос как подзапрос внутри оператора case, чтобы сравнить индекс этого нового значения с индексами ваших предыдущих значений.
РЕДАКТИРОВАТЬ (2/4/2019):
После нескольких комментариев я думаю, что следующее может приблизить вас к тому, что вам нужно. Я не смог проверить этот запрос, но он должен быть закрыт.
CREATE TEMPORARY TABLE booking_conflicts AS (
SELECT MAX(
IF(
FIND_IN_SET(
(SELECT FIND_IN_SET('12:00', REPLACE(SUBSTRING(column_type,6, LENGTH(column_type) - 6), '\'', '') )
FROM information_schema.columns
WHERE column_name='your_enum_column'
AND table_name = 'booking'
AND table_schema = 'your_schema'),
CONCAT(time_slot+0, ',', time_slot+1)
) > 0,
1,
0) AS is_time_conflict
FROM booking
WHERE facility_id = 6
AND booking_date = '2020-07-04'
);
INSERT INTO bookings
(facility_id,booking_date,time_slot,member_id)
VALUES (6,'2020-07-04','12:00',2)
WHERE (SELECT is_time_conflict FROM booking_conflicts) = 0;
Что он делает, так это получает все использованные временные интервалы с этой даты для этого объекта и сравнивает их с новым временным интервалом, который вы пытаетесь использовать. Если индекс нового временного интервала равен индексу ранее использованного time_slot или ранее использованного time_slot + 1, то запрос вернет 1, иначе 0. Мы сохраняем это во временной таблице и получаем доступ к временной таблице из вставки .