LINUX.ORG.RU

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


0

2

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

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

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

DELIMITER $$

CREATE
    /*[DEFINER = { user | CURRENT_USER }]*/
    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.

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

★★★★★
Ответ на: комментарий от tuxin

Блин, в SQLite известно, а в крутом MySQL не известно?

Xintrea ★★★★★
() автор топика

в BEFORE INSERT поля auto-generated ещё не определены.

vtVitus ★★★★★
()
Ответ на: комментарий от visual

AFTER

При AFTER не работает выражение

SET NEW.sort_order = NEW.id;

Так как нет NEW.

Замена NEW на lt_articles не помогает.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от kernelpanic

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

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

При AFTER не работает выражение

SET NEW.sort_order = NEW.id;

Так как нет NEW.

Возможно и не работало, но не по этой причине

Elyas ★★★★★
()

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

Не умеешь пользоваться гуглом.

google://mysql trigger before insert auto_increment

Решение в первой ссылке:

SET next_id = (SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_SCHEMA=DATABASE() AND TABLE_NAME='lt_articles');

anonymous
()
Ответ на: комментарий от anonymous

Решение в первой ссылке

Это вообще не по-человечески.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Elyas

Возможно, тебя устроит NEW.sort_order=LAST_INSERT_ID()


Нет, поведение LAST_INSERT_ID() вообще неадекватное:

Особенности работы LAST_INSERT_ID() и AUTO_INCREMENT в MySQL
http://blog.nagaychenko.com/2011/03/11/особенности-работы-last_insert_id-и-au...


Вышел из положения так:

CREATE
    TRIGGER `on_add_article` BEFORE INSERT ON `lt_articles` 
    FOR EACH ROW BEGIN
     SET @max_number = ( SELECT MAX(id) FROM `lt_articles` );
     SET NEW.sort_order=@max_number+1;
    END;
$$
Xintrea ★★★★★
() автор топика

вы меня вымораживаете

нет же, чтобы почитать документацию: http://dev.mysql.com/doc/refman/5.6/en/trigger-syntax.html

In a BEFORE trigger, the NEW value for an AUTO_INCREMENT column is 0, not the sequence number that is generated automatically when the new row actually is inserted.

так нужно лезть на ЛОР.

нет же, чтобы почитать стекоферфлоу: http://stackoverflow.com/questions/16597467/mysql-after-insert-trigger-get-au...

SET NEW.Sort_Placement = LAST_INSERT_ID() + 1;

так нужно лезть на ЛОР.

x0r ★★★★★
()
Ответ на: вы меня вымораживаете от x0r

если LAST_INSERT_ID это «плохо» и «неадекватное поведение», то сделай SELECT COUNT(id) FROM table и прибавь 1. будет медленно, зато «хорошо» и «адекватно».

x0r ★★★★★
()

чего к человеку пристали

он просто не знает инглиш

а вы ему гугл в помощь суете

anonymous
()
Ответ на: комментарий от erzent

иногда я жалею, что игнор почистил, ОП сейчас первый кандидат.

x0r ★★★★★
()

Xintrea

бугага

иди дворником работай, чучмо

anonymous
()
Ответ на: комментарий от erzent

я работаю без знаний его уже 8 лет, в крайнем случае гугл переводчик, а так похожие слова ищу, и термины.

ну ты и лошара анскильная ппц, откуда такие имбецилы получаются вообще? у вас там секта по рождению все новых и новых дегенератов международная открылась?

anonymous
()
Ответ на: вы меня вымораживаете от x0r

нет же, чтобы почитать документацию: http://dev.mysql.com/doc/refman/5.6/en/trigger-syntax.html

Чувак, ты не понимаешь сути проблемы.

В MySQL на триггерах существуют дикие ограничения, которые порождают логические коллизии.

То есть, при решении простой задачи «одно поле должно быть равно второму в момент добавления», MySQL предлагает ее решить со следующими ограничениями:

1. В BEFORE INSERT неизвестно значение автоинкрементального поля, но возможно установить значение поля-дубликата.

2. В AFTER INSERT значение автоинкрементального поля известно, но невозможно установить значение поля-дубликата.

3. В триггере AFTER INSERT нельзя сделать UPDATE на только что добавленную запись.

Еще обрати внимание, что задача шире, чем копирование численного ID, и ее в общем случае нельзя решать через математическое вычисление следующего ID каким-либо способом. Потому что при INSERT возможно два варианта:

1. Добавление без указания ID (и тогда ID вычисляется MySQL)

2. Добавление с указаинем ID (и тогда ID записывается в базу тот, который указан в запросе)

Очевидно, что все предложенные здесь решения (и через LAST_INSERT_ID(), и через information_schema.TABLES, и через MAX) в общем случае неработоспособны.

Я сделал для себя решение, которое работает в моем случае.

Но в топике задана вполне конкретная задача:

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


Вот ее и нужно решить.

Надеюсь, ты прекрасно владеешь профессией, в отличие от меня, а так же знаешь английский, как я его не знаю, и тебе не составит труда написать решение.

Всего одна мессага с решением. Прошу:

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от Xintrea

если я правильно понял:

1. в таблицу делается insert: PK или генерится, или передается

2. для вставленной записи значение sort_order должно автоматом стать равно PK

3. выкинуть поле sort_order и использовать вместо него id - не вариант

please confirm.

x0r ★★★★★
()
Последнее исправление: x0r (всего исправлений: 1)
Ответ на: комментарий от x0r

незнание тех. английского это повод не лезть в профессию.

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

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

Я перевожу крупные тексты с англицкого:

http://webhamster.ru/site/page/index/articles/comp/276

но считаю, что англицкого не знаю.

Ты считаешь, что англицкий знаешь. Так покажи свои переводы, мы на них посмотрим и оценим твою профессиональную состоятельность.

Xintrea ★★★★★
() автор топика
Ответ на: комментарий от x0r

1. в таблицу делается insert: PK или генерится, или передается
2. для вставленной записи значение sort_order должно автоматом стать равно PK
3. выкинуть поле sort_order и использовать вместо него id - не вариант

Все верно.

Xintrea ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.