"?-6ren"> "?-我有两个表 公司信息(代码、价格、父表) 观察列表(符号,观察值) 每当更新 COMPANYINFO 中的 PRICE 时,我需要从 COMPANYINFO 的 PARENTTABLE 字段中的表中获-6ren">
gpt4 book ai didi

mysql - 是否可以在 MySql 触发器中将表名派生为 "NEW."?
转载 作者:行者123 更新时间:2023-11-29 01:48:43 25 4
gpt4 key购买 nike

我有两个表

公司信息(代码、价格、父表)

观察列表(符号,观察值)

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

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

开始
更新观察列表 SET WATCHVALUE= (SELECT MAX(WATCHVALUE) FROM NEW.PARENTTABLE) WHERE SYMBOL = NEW.SYMBOL;
结束

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

最佳答案

不可以,您不能将值用作表名。表名必须在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 Antipatterns .

关于mysql - 是否可以在 MySql 触发器中将表名派生为 "NEW.<TABLE FEILD>"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56721185/

25 4 0