Задать вопрос
@telop

Как исправить «subquery returns more than 1 row» в «after update» триггере?

У меня есть две таблицы, test1 иtest2, данные в test2 зависят от данных в test1 и я создал триггер after update который после изменения данных вtest1 обновляет test2
Все работает если у меня в таблице всего 1 строка, тогда триггер срабатывает, но если строк больше одной, тогда выдает ошибку subquery returns more than 1 row
Вот сам триггер:
CREATE DEFINER=`root`@`localhost` TRIGGER `afupd_yzv2` AFTER UPDATE ON `test1` FOR EACH ROW BEGIN 
    UPDATE `database`.`test2` SET `value1` = (SELECT value1 FROM test1) * 2 WHERE (`id` = (SELECT id FROM test1));
END

Помогите пожалуйста, что можно сделать чтобы я мог работать с множеством строк, а не с одной?
  • Вопрос задан
  • 162 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 2
@Akela_wolf
Extreme Programmer
А что вы пытаетесь тут сделать? Вот конкретно этот подзапрос (SELECT id FROM test1) он для чего? Вы выбираете все записи из таблицы test1, что, как бы, очень подозрительно. А если там будет миллион записей?

У вас в триггере есть переменные NEW и OLD, указывающие на обновленную запись в таблице test1 - вот и используйте их, чтобы определить какие записи в таблице test2 вам нужно обновить.
Ответ написан
@NiceDay
у вас в UPDATE входит два подзапроса. какой-то из них возвращает больше одной строки, что не применимо в данной ситуации.

например, вот этот блок (SELECT value1 FROM test1) -
в случае, если ваша таблица test1 содержит больше одной строки, этот запрос вернет их все.
если вам нужно получить новое значение столбца обновляемой таблицы, вы можете, как заметил комментатор выше, использовать NEW или OLD:
UPDATE `database`.`test2` SET `value1` = NEW.value1 * 2...


аналогично предыдущему,
WHERE (`id` = (SELECT id FROM test1));
вернет столько строк с одним столбцом id, сколько существует в таблице test1, что не допустимо для оператора равенства.
если вам нужно обновить строку в таблице test2, id которой такой же, как и id у обновляемой записи в test1, то следует использовать NEW.id и ваш запрос приобретет следующий вид:

CREATE DEFINER=`root`@`localhost` TRIGGER `afupd_yzv2` AFTER UPDATE ON `test1` FOR EACH ROW BEGIN 
    UPDATE `database`.`test2` SET `value1` = NEW.value1 * 2 WHERE `id` = NEW.id
END
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы