Запустить обновление всех строк

avatar
aimee
1 июля 2021 в 19:25
82
1
1

У меня проблемы с MySQL TRIGGER.

У меня есть таблица сотрудников с некоторой базовой информацией. Затем у меня есть ВИД, который мы называем нашей финансовой_системой. В представлении Finance_system содержится много информации из многих источников. Несколько столбцов в Finance_system связаны с внутренним розыгрышем продаж и возвращают случайные значения из других таблиц каждый раз, когда запрашивается представление Finance_system. Наконец, у меня есть таблица под названием EP1. Его работа состоит в том, чтобы хранить некоторые данные из финансовой_системы, особенно некоторые столбцы со случайными значениями. Это удерживает их от ОБНОВЛЕНИЯ/изменения при каждом запросе. Таблица EP1 обновляется с помощью ТРИГГЕРА, который срабатывает ПОСЛЕ ОБНОВЛЕНИЯ для определенных столбцов в таблице сотрудников. Триггер работает, и таблица EP1 обновляется, но обновляется вся таблица, а не строки, связанные с обновленным employee_id.

Я прочитал политику Stacks перед публикацией и понял, что необходим воспроизводимый пример, поэтому я создал Fiddle, но запутал данные и включил только несколько столбцов. Надеюсь, этого достаточно, так как я измотал Google, пытаясь понять, почему он не работает.

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=942dbabba180df86b7ac9317bbcdd64b

Изменить:

Простая версия: при обновлении Table1.status триггер должен обновить Table3.rand1 значениями из Table2.rand1, где совпадают идентификаторы. Каждый идентификатор имеет две строки в Table2 и Table3. Моя текущая проблема заключается в том, что при срабатывании триггера он обновляет все строки в таблице 3, и я хочу, чтобы он обновлял только строки, связанные с идентификатором, который был обновлен в таблице 1. Соединение не будет работать в этом сценарии, так как Table2 на самом деле является VIEW, использующим rand() в моих реальных данных.

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=329e2dd3bf2fff39afc5388721c53ddc

Эми

Источник
bigtheo
1 июля 2021 в 21:27
0

могу я увидеть ваш код???

aimee
1 июля 2021 в 22:54
0

@bigtheo, код в скрипке не помог?

Liviu Chircu
2 июля 2021 в 07:06
0

Не могли бы вы свести эту проблему к базовому примеру (например, в вашем случае представление Finance_system не имеет значения), где триггер не работает так, как вы ожидаете? Попробуйте поэкспериментировать с простой таблицей, триггером и желаемым механизмом обновления и опубликуйте весь этот код SQL на скрипке, чтобы получить помощь.

aimee
2 июля 2021 в 10:57
0

@ Ливиу, спасибо. Я обновил пост более простой версией и новой скрипкой.

Liviu Chircu
2 июля 2021 в 13:12
0

A) синтаксис триггера неверен, я получаю ошибки как с MariaDB, так и с MySQL 8.0. Б) У триггера UPDATE нет предложения WHERE. Конечно, он обновит все строки Table3, если вы не поместите их. Не могли бы вы попробовать добавить один, возможно, WHERE Table3.id = NEW.id?

aimee
2 июля 2021 в 14:10
0

@ Ливиу, спасибо за помощь. Я исправил синтаксическую ошибку и попробовал ваше предложение предложения where. Он становится ближе, но вы увидите в новой скрипте, что он по-прежнему не будет обновляться по идентификатору, и один идентификатор, похоже, переопределяет другие. Скрипка: dbfiddle.uk/…

Liviu Chircu
2 июля 2021 в 15:13
0

У вас осталось 2 ошибки: предложение WHERE в подзапросе неверно, так как оно указывает на Table3 вместо Table2. Тогда вам все еще не хватает предложения WHERE во внешнем запросе, что я уже призывал вас исправить выше.

aimee
2 июля 2021 в 15:37
1

@ЛивиуЧирку. Я очень ценю всю помощь! После внесения ваших изменений мне просто нужно было добавить сравнение сеансов в предложении where подзапроса, и это сработало отлично. Скрипка: dbfiddle.uk/…

Liviu Chircu
2 июля 2021 в 15:53
0

подытожил ответ, поэтому вопрос можно пометить как «решенный».

Ответы (1)

avatar
Liviu Chircu
2 июля 2021 в 15:53
1

Проверьте запрос UPDATE триггера: в нем отсутствует предложение WHERE, поэтому обновляются все строки Table3 вместо тех, которые соответствуют желаемому id.