是否可以在 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。
我有两个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。