MySQL: триггер ОБНОВЛЕНИЯ. Получить значение столбца, используемого в предложении where ОБНОВЛЕНИЯ, если оно не соответствует какой-либо строке?

#mysql #sql #triggers #sql-update #where

#mysql #sql #триггеры #sql-обновление #where-предложение

Вопрос:

MySQL: В теле триггера обновления могу ли я получить значение столбца, указанного в where предложении инициирующего запроса, если предложение wher e вообще не соответствует ни одной строке?

Я должен сделать следующее, но НЕ ИСПОЛЬЗУЯ прямой запрос, такой как ПРИ ОБНОВЛЕНИИ ДУБЛИКАТА КЛЮЧА и так далее:

Если у меня есть:

 UPDATE my_table SET idiotism_level=5 WHERE name='Pencho'
  

… и предложение where не соответствует НИ ОДНОЙ СТРОКЕ, я бы хотел автоматически инициировать вставку строки, имеющей значение name='Pencho' перед обновлением, и тогда UPDATE , предположительно, совпадет и будет работать должным образом.

Возможно ли это?

Ответ №1:

Это может быть сделано в ПРАВИЛЕ в других системах баз данных (PostgreSQL), которого не существует в MySQL. Это правило, а не триггер, поскольку вы должны анализировать запрос, а не результат запроса.

Но для MySQL вы можете выполнять задания предварительного запроса с помощью MySQL-Proxy. Вы должны иметь возможность изменить свой запрос на обновление и создать вставку, выполнив дополнительный запрос «проверить, существует ли строка» из MySQL-Proxy (я не говорю, что это хорошее решение, но если у вас нет способа заставить код работать лучше, вы можете исправить это на этом уровне).

Комментарии:

1. Спасибо. Да, я знаю, что то, о чем я спрашиваю, не совсем триггер. Я уже начал менять уровень своего приложения на NNN places с вариантом вставок с ОБНОВЛЕНИЕМ ДУБЛИКАТА КЛЮЧА 🙂 Пока я буду придерживаться того, что доступно и совместимо. Надеюсь, в будущих версиях MySQL тоже будут реализованы правила.

Ответ №2:

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

Комментарии:

1. Да, мои опасения оправдываются: (Скорее всего, это будет невозможно. Это очень жаль, потому что было бы удобно убрать такого рода скучную логику с вашего прикладного уровня. Не так ли?

Ответ №3:

Если имя имеет уникальный индекс, вы можете использовать REPLACE

 REPLACE INTO my_table (idiotism,name) VALUES ( 5,'Pencho');
  

Комментарии:

1. Да, name это уникальный индекс. Я не знал об этой вещи «ЗАМЕНИТЬ». Спасибо. Я попробую этот подход в будущем.