Mysql Не срабатывает простой триггер в MySQL. Почему?

xintrea

Новичок
Есть база linuxtr, есть таблица lt_articles. В этой таблице два поля - id (PRIMARY KEY, AUTO INCREMENT) и sort_order.

Задача: при добавлении новой записи, поле sort_order должно устанавливаться значением id.

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

Код:
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.

Что делаю не так?
 

Redjik

Джедай-мастер
после добавления надо, а не до...

ЗЫ. дурацкая мысль таким образом порядок инкрементить, имхо...
 

xintrea

Новичок
Очень даже правильная мысль, и она у меня работает годами на SQLite. Ты всегда знаешь, что sort_order будет уникальным при правильной работе (так как идет от id), а так же знаешь, что новые добавляемые строки будут последними при сортировке по sort_order.

Я хотел бы на sort_order просто автоинкремент навесить, но в SQL-движках автоинкремент почему-то возможен только на одном поле таблицы, и это поле обычно id.

Так как заставить этот триггер работать? (Подобный триггер в SQLite работает без вопросов).
 

Тугай

Новичок
Ответ гуглится, только через доп. таблицу:
Код:
CREATE TABLE table1_seq
(
  id int not null auto_increment primary key
)
|
CREATE TABLE table1
(
  id int not null default 0 primary key,
  content int
)
|
CREATE TRIGGER tg_ai_table1
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  INSERT INTO table1_seq() VALUES();
  SET NEW.id = LAST_INSERT_ID(), NEW.content = COALESCE(NEW.content, NEW.id);
END
|

INSERT INTO table1 (id, content) VALUES (5,NULL),(7,-1)
|
SELECT * FROM table1;
Код:
| ID | CONTENT |
|----|---------|
|  1 |      1 |
|  2 |      -1 |
 

xintrea

Новичок
А что мешает сортировать по id?
Эээ... 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.

Стандартная техника.
 

fixxxer

К.О.
Партнер клуба
а, то есть пересортировка методом перестановки местами.

с ограничениями mysql-я можно, скажем timestamp-поле использовать, с default current_timestamp. какая разница - тот же int внутри ;) разве что с двумя вставками в секунду проблема.

а вообще я бы сделал два запроса и не парился, в большинстве фреймворков есть нечто вроде afterInsert().
 
Сверху