Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не срабатывает простой триггер в MySQL. Почему? / 9 сообщений из 9, страница 1 из 1
03.07.2014, 09:50:42
    #38686458
Не срабатывает простой триггер в MySQL. Почему?
Есть база linuxtr, есть таблица lt_articles. В этой таблице два поля - id (PRIMARY KEY, AUTO INCREMENT) и sort_order.

Задача: при добавлении новой записи должно произойти sort_order = id .

Я делаю такой триггер:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
DELIMITER $$

CREATE
    TRIGGER `linuxtr`.`on_add_articles` BEFORE INSERT
    ON `linuxtr`.`lt_articles`
    FOR EACH ROW
    BEGIN
    SET NEW.sort_order = NEW.id;
    END$$

DELIMITER ;


Но он не срабатывает - при добавлении новой записи значение поля sort_order остается равным 0.

Что делаю не так?
...
Рейтинг: 0 / 0
03.07.2014, 12:22:19
    #38686690
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывает простой триггер в MySQL. Почему?
Да потому что BEFORE INSERT - т.е. ПЕРЕД вставкой. Вставка ещё не выполнена. Откуда взяться значению ID?
...
Рейтинг: 0 / 0
03.07.2014, 12:57:15
    #38686743
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывает простой триггер в MySQL. Почему?
Что за форма регистрацииЗадача: при добавлении новой записи должно произойти sort_order = id .решение: сортировать по ид, поле сорт_ордер вообще удалить.
...
Рейтинг: 0 / 0
03.07.2014, 17:07:27
    #38687084
Не срабатывает простой триггер в MySQL. Почему?
tanglir,

Id - это уникальный идентификатор, но никак не порядок сортировки.

Пример. Имеем объекты, например строки меню (id, sort_order, name, ...):

1, 1, Файл
2, 2, Отменить
3, 3, Повторить
4, 4, Вырезать
5, 5, Вставить
6, 6, Выделить все
7, 7, Найти
8, 8, Заменить

Теперь нам нужно добавить пункт Копировать, и засунуть его между Вырезать и Вставить. Менять ID нельзя, он дается один раз и он уникальный (ведь это ID), к нему уже что-то в других частях системы привязано.

Мы добавляем новую строку, с триггером она добавится как:

9, 9, Копировать

Далее переносим в нужное место:

1, 1, Файл
2, 2, Отменить
3, 3, Повторить
4, 4, Вырезать
9, 5, Копировать
5, 6, Вставить
6, 7, Выделить все
7, 8, Найти
8, 9, Заменить

ID не поменялся, размещение в нужном месте сделали за счет sort_order.
...
Рейтинг: 0 / 0
03.07.2014, 17:16:24
    #38687089
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывает простой триггер в MySQL. Почему?
Что за форма регистрации,

а вы сразу не указали, что сорт_ордер впоследствии может изменяться :)

ЕМНИП похожая тема не так давно была, и обсуждающие сошлись на том, что проще всего сделать ХП для такой вставки (потому что в бефор-триггере ид ещё не известен, а в афтер-триггере уже ничего нельзя менять).
...
Рейтинг: 0 / 0
04.07.2014, 16:32:36
    #38688158
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывает простой триггер в MySQL. Почему?
tanglir,

tanglir ЕМНИП похожая тема не так давно была, и обсуждающие сошлись на том, что проще всего сделать ХП для такой вставки (потому что в бефор-триггере ид ещё не известен, а в афтер-триггере уже ничего нельзя менять).

Я сделал через information_schema.
Т.к. тригере BEFORE INSERT мы не можем получить значение для поля AUTO_INCREMENT, а в тригере After мы не можем поменять значение поля воспользуемся такой конструкцией: information_schema.TABLES.AUTO_INCREMENT храниться значение, которое будет вставлено в поле AUTO_INCREMENT

в тригире BEFORE INSERT
Код: plsql
1.
2.
3.
4.
5.
    SELECT t.AUTO_INCREMENT 
          FROM information_schema.TABLES t WHERE t.TABLE_NAME = 'bonus_accrual'
          INTO ID_ROW;

    SET new.ID_PART = ID_ROW;


Все замечательно работает
...
Рейтинг: 0 / 0
04.07.2014, 16:44:03
    #38688177
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывает простой триггер в MySQL. Почему?
Близнец1980Все замечательно работаетПока в двух разных сессиях одновременно две вставки не прилетят.
...
Рейтинг: 0 / 0
04.07.2014, 17:17:48
    #38688246
Близнец1980
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывает простой триггер в MySQL. Почему?
miksoftБлизнец1980Все замечательно работаетПока в двух разных сессиях одновременно две вставки не прилетят.

Встречал, что во время срабатывания триггера та таблица, на которую он повешен, становится залоченой. Или это только к MyISAM относится?
Не подскажите, где можно почитать об этом?
...
Рейтинг: 0 / 0
04.07.2014, 17:22:10
    #38688257
miksoft
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Не срабатывает простой триггер в MySQL. Почему?
Близнец1980Встречал, что во время срабатывания триггера та таблица, на которую он повешен, становится залоченой. Или это только к MyISAM относится?
Не подскажите, где можно почитать об этом?Таблицы MyISAM лочатся на все время их модификации, а не только "во время срабатывания триггера". Так что применительно к MyISAM мой предыдущий комментарий неактуален.
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Не срабатывает простой триггер в MySQL. Почему? / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]