是否可以在 MySql 触发器中将 table 名称派生为 "NEW.<TABLE FEILD>"?

Is it possible to derive table name as "NEW.<TABLE FEILD>" in MySql Trigger?

我有两个table

公司信息(符号、价格、父表)

观察名单(符号,观察值)

每当更新 COMPANYINFO 中的 PRICE 时,我需要从 COMPANYINFO 的 PARENTTABLE 字段中的 table 获取最大值并更新 WATCHLIST table.

的 WATCHVALUE

我在COMPANYINFO中定义的触发器如下

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

数据库未采用 NEW.PARENTTABLE 值,而是尝试采用新数据库的 PARENTTABLE table。是否可以使触发器采用字段值。我无法使用动态查询,因为它在 MySql 触发器中是不允许的。

不,您不能使用值作为 table 的名称。 table 的名称必须在解析 SQL 语句时固定。

您可以为每个可能的父 table 名称使用 CASE 语句,并从各自的 table.

中查询最大值
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

如果你需要引用多种table,我觉得你的数据模型可能设计不好。听起来很可疑。


回复您的评论:

您不需要为每个符号设置不同的 table。这是数据库设计中可疑模式的根本原因。我在我的书中称它为 "Metadata Tribbles" SQL Antipatterns