Есть ли в MySQL функция, которая не позволяет выбирать значение непосредственно после значения, уже выбранного из типа данных ENUM в базе данных?

0

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

Не могу найти код где угодно

Нет доступных для ENUM

Временной интервал ENUM ('09: 00 ',' 09:30 ',' 10:00 ') 09:00 уже сохранен

'09: 30 'не должно быть разрешено вставлять в таблицу; '10: 00' должно вставлять штраф

Теги:
enums
time
triggers

1 ответ

0

Я не знаю функции по умолчанию, чтобы делать то, что вы хотите.

Я думаю, что вам придется сделать некоторые проверки с использованием индекса 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. Мы сохраняем это во временной таблице и получаем доступ к временной таблице из вставки,

  • 0
    Спасибо за ответ. У меня просто есть небольшая проблема, как бы я поместил это в заявление случая
  • 0
    Вставить в бронирования (service_id, booking_date, time_slot, member_id) Значения (6, '2020-07-04', '12: 00', 2) ГДЕ ВЫБРАТЬ FIND_IN_SET ('new_value', REPLACE (SUBSTRING (column_type, 6, LENGTH ( column_type) - 6), '\' ',' ')) AS enum_options FROM information_schema.columns WHERE column_name =' time_slot 'AND table_schema =' mylescoop 'То, что я уже пробовал, не уверен, как связать предложение where
Показать ещё 8 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню