Триггер для накопления данных в поле

252
05 апреля 2017, 14:31

Используется
MySql 5,7 - х64

Имеется таблица

CREATE TABLE `tst_005_tbl_00` (
    `id` INT(11) NULL DEFAULT NULL,
    `pl_1` VARCHAR(1000) NULL DEFAULT NULL,
    `pl_1_sprch` ENUM('pl_1_1','pl_1_2','pl_1_3','pl_1_4','pl_1_5','pl_1_6') NULL DEFAULT NULL
)
COLLATE='utf8_general_ci'
ENGINE=MyISAM
;

Сценарий
1. В поле "pl_1_sprch" выбираем значение из выпадающего списка;
2. В поле "pl_1" триггер добавляет новые значение к существующим значениям через запятую.

Вопрос
1. Можно ли реализовать данный сценарий?
2. Если "да", то как ориентировочно должно выглядеть решение?
3. Какими другими способами можно решить данную задачу?
4. Как сделать, чтобы данные в поле, где собираются метки не повторялись?

Answer 1

Можно (хотя под вопросом из за enum), но не нужно. Работать с данными через запятую в реляционных БД крайне не удобно. Данные хранящиеся в таком виде вызывают массу проблем. В реляционных БД в таких случаях создают отдельную таблицу в которой лежит id записи из основной таблицы и отдельное значение из списка и так несколько строк. После такой нормализации все сразу встает на свои места, enum начинает работать как ему предписано - хранить одно значение из нескольких.

Практически во всех случаях, когда необходимо хранить множественные значения, реализация работы с такой таблицей на клиенте достаточно проста. Это может быть список с галочками, на все выбранные пункты просто даем insert. Или, например, теги к статьям (как на stackoverflow), там человек явно добавляет по очереди значения (или удаляет их) нам требуется его действия превратить в insert или delete.

Кстати, если список возможных значений расширяемый, т.е. может расти в будущем, то вместо enum лучше воспользоваться отдельной таблицей - справочником возможных значений. Тогда полная структура будет выглядеть примерно так:

Таблица теги:
ID-тега
Название
Ваша таблица tst_005_tbl_00
ID
другие поля
Связующая таблица "Теги статьи"
ID-tbl_00
ID-тега
primary key (ID-tbl_00, ID-тега),
foreign key ID-tbl_00 references tst_005_tbl_00(ID),
foreign key ID-тега references Теги(ID-тега)
READ ALSO
Для чего нужен Constraint name в mysql?

Для чего нужен Constraint name в mysql?

Для чего нужен Constraint name при создании связи таблиц в mysql? Пример:

377
Заменяющие значение при объединение MySQL

Заменяющие значение при объединение MySQL

Добрый деньЕсть две таблицы sm_imei и sm_city

227