У меня есть таблица, которая использует модель списка Adjacency для хранения иерархии. Поэтому мои самые важные столбцы в этой таблице:
ItemId // is auto_increment
ParentId
Level
ParentTrail // in the form of "parentId/../parentId/itemId"
то я создал перед тигром ввода, который заполняет столбцы Level
и ParentTrail
. Поскольку последний столбец также содержит текущий идентификатор элемента, мне пришлось использовать трюк в моем триггере, потому что столбцы auto_increment
недоступны в триггере перед вставкой. Поэтому я получаю это значение из таблицы information_schema.tables
.
Все работает нормально, пока я не попытаюсь написать триггер обновления, который обновил бы мой элемент и его потомков, когда элемент изменит родительский элемент (ParentId
изменился). Но я не могу обновить свою таблицу внутри триггера обновления. Все, что я могу сделать, это изменить текущие значения записи, но не другие.
Я мог бы использовать отдельную таблицу для данных иерархии, но это означало бы, что мне также нужно было бы создать представление, которое объединило бы эти две таблицы (соотношение 1:1), и я хотел бы избежать этого, это вообще возможно.
Есть ли способ иметь все это в одной таблице, чтобы эти поля (Level
и ParetTrail
) автоматически устанавливали/обновляли с помощью триггеров?
Это звучит так, как будто это возможно, но это будет связано с тяжелым сопоставлением строк и т.д. Не хотелось бы копаться в нем.
Если вы хотите немного изменить модель базы данных и реализовать Nested Set (прокрутите страницу вниз), это, вероятно, можно было бы сделать легко, указав значения триггера влево-вправо.