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

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

Не удается найти код в любом месте

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

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

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

1 Ответ

0 голосов
/ 01 апреля 2019

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

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

...