Можно ли получить имя таблицы как «NEW. <TABLE FEILD>» в MySql Trigger? - PullRequest
2 голосов
/ 23 июня 2019

У меня есть две таблицы

COMPANYINFO (СИМВОЛ, ЦЕНА, PARENTTABLE)

WATCHLIST (СИМВОЛ, WATCHVALUE)

Всякий раз, когда ЦЕНА в COMPANYINFO обновляется, мне нужно получитьмаксимальное значение из таблицы в поле PARENTTABLE для COMPANYINFO и обновление таблицы WATCHVALUE таблицы WATCHLIST.

Триггер I, определенный в COMPANYINFO, имеет следующий вид:

BEGIN UPDATE WATCHLIST SET WATCHVALUE= (SELECT MAX(WATCHVALUE) FROM NEW.PARENTTABLE) WHERE SYMBOL = NEW.SYMBOL; END

База данныхне принимает значение NEW.PARENTTABLE, а пытается получить таблицу PARENTTABLE базы данных NEW.Можно ли заставить триггер принимать значение поля.Я не могу использовать динамический запрос, поскольку он не разрешен в триггере MySql.

1 Ответ

3 голосов
/ 23 июня 2019

Нет, вы не можете использовать значение в качестве имени таблицы.Имя таблицы должно быть фиксированным во время синтаксического анализа оператора SQL.

Вы можете использовать оператор CASE для каждого возможного имени родительской таблицы и запросить максимум из соответствующей таблицы.

BEGIN
DECLARE MAX_VALUE NUMERIC(9,2);

CASE NEW.PARENTTABLE
 WHEN 'table1' THEN SELECT MAX(WATCHVALUE) INTO MAX_VALUE FROM table1;
 WHEN 'table2' THEN SELECT MAX(WATCHVALUE) INTO MAX_VALUE FROM table2;
 ...others...
END CASE;

UPDATE WATCHLIST SET WATCHVALUE = MAX_VALUE WHERE SYMBOL = NEW.SYMBOL;
END

Я думаю, что ваша модель данных не может быть разработана должным образом, если вам нужно сослаться на различные таблицы.Звучит подозрительно.


Ваш комментарий:

Вам не нужно иметь разные таблицы для каждого символа.Это коренная причина подозрительного паттерна в дизайне вашей базы данных.В своей книге я назвал это «Метаданные трибл» Антипаттерны SQL .

...