Официальная возможность получить лицензионный софт бесплатно.
Giveaway of the Day
Это не реклама!

Щелкните для получения прогноза по Биробиджану


среда, 18 ноября 2020 г.

MySQL: group_concat - ограничение и как его преодолеть

 В небезызвестной OCS-NG Inventory, по крайней мере до версии 2.1.2 включительно, есть таблица AccountInfo, в которой хранятся различные дополнительные параметры оборудования, которые можно менять в разделе Administrative Data

Но есть у нее недостаток: MySQL не поддерживает косвенную адресацию (обратиться в полю по имени, которое находится в переменной или является результатом выражения), а поля в этой таблице имеют вид FIELDS_NNN, где NNN - номер поля, поэтому для обращения, скажем, к полю "Владелец компа" надо делать лишний селект, чтобы узнать, в каком из FIELDS-ов этот владелец хранится. И не просто селект, а еще и при каждом обращении к этому полю, чтобы при изменении его номера не пришлось перелопачивать весь скрипт.
Довольно долго я любил себе мозг, пока мне не подсказали, что можно же сделать view, в котором имена столбцов будут тем, что называется new field при создании нового элемента пользовательских (они же - административные) данных


Я сделал этот view, но ведь его надо переформировывать при каждом изменении AccountInfo, а мне лень вручную менять поля. Поэтому я сделал хранимую процедуру, которая формирует этот view автоматически, добавляя в него еще и некоторые другие нужные мне поля.

Не буду подробно расписывать, что в ней к чему, отмечу лишь момент с group_concat, который у меня формирует часть оператора, выполняемого для создания/обновления view.
Какое-то время оно работало нормально, но при добавлении очередного поля его имя обрезалось до 1 буквы, а добавленные после него поля вообще не попали в view. Что за?
Оказалось, у group_concat есть ограничение по длине - 1024 символа. Но его можно отменить как глобально, так и локально.
Поскольку мне это ограничение мешает только в данной процедуре, то именно в ней я его и меняю. Теперь view формируется правильно.

Основная идея автоматического создания view: задействовать возможность выполнения оператора, хранящегося в некой переменной. Примеров создания таких операторов полно, поэтому здесь копаться не будем.
А вот формирование списка полей надо объяснить.
Параметры полей - их названия, порядок вывода и т.п.  - хранятся в таблице accountinfo_config и частично (варианты выбора для полей типа select, radio, checkbox) в таблице config.
Для формирования оператора я отбираю имена и ID-ы полей, по сути создавая столбцы в view, где name становится заголовком столбца, а в него отбирается поле fields_ID. Вот как выглядит начало DDL этого view:
--
--
А вот как начинается моя accountinfo_config


Комментариев нет:

Отправить комментарий

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