#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
это уникальный индекс. Я не знал об этой вещи «ЗАМЕНИТЬ». Спасибо. Я попробую этот подход в будущем.