我正在创建一些触发器以将给定产品的平均评分存储在产品表上。我还被要求存储产品的评论总数。所以 - 我需要在我的触发器中检索 2 个值,然后适当地更新目标表。
我应该使用单独的选择语句
SET my_a = SELECT a FROM foo;
SET my_b = SELECT b FROM foo;
将结果集作为变量检索的单个语句(这甚至可能吗?):
SET var = SELECT (a,b) FROM foo;
UPDATE bar SET c=var.a,d=var.b;
或者甚至可能将结果集存储在触发器内的临时表中(这甚至可能吗?)?
第一种方法是最好的,因为生成的查询开销最小。事实上,在 MySQL 存储过程语言中,您希望声明的变量尽可能少。
第二个是不可能的,因为 MySQL Stored Rrocedure Language 不支持对象。如果您...
第三种方法是不可能的,因为 MySQL Triggers 中不允许显式 DDL 和 DDL via Dynamic SQL。
您可能必须使用MyISAM或MEMORY存储引擎创建常规表。然后,您可以让触发器将您的数据编译为实际存在的表。MyISAM更好,因为如果服务器出现故障,到目前为止编译的数据都在磁盘上。MEMORY表的写入速度更快,但在系统重新启动时会消失。
根本不要使用CREATE TEMPORARY TABLE,因为这样的表只会在数据库连接存在时持续存在,并且对于触发器的调用也是私有的。更糟糕的是,如果您使用 MySQL 复制并且
STOP SLAVE
在从属服务器上运行,则通过 CREATE TEMPORARY TABLE 创建的任何表都会从 SQL 线程中消失,并且当您运行时复制会立即中断,START SLAVE
并且这些临时表不再存在。这是一个相当古老的问题,所以以前可能不存在这种语法,但现在您可以使用
SELECT INTO
:我发现这比第一种语法更美观,而且查询只需运行一次。