在临时表上调用存储过程

Calling stored procedures on temporary tables

是否可以在 MySQL 中的临时 table 上执行存储过程?我正在尝试创建一个数据导入系统,理论上可以同时为不同用户 运行。如果一个用户正在将文件导入临时 table 而另一个用户正在做同样的事情,是否有可能两个用户都调用同一个共享过程,因为过程中引用的 tables 将匹配临时 tables?

单个用户的工作流程如下所示...

  1. 将数据加载到临时 table newdata
  2. 在对 table newdata
  3. 进行修改和更新时调用存储过程
  4. 存储过程将数据从 newdata 移动到 live/permanent table。

...而另一个用户可能正在做同样的事情。

是的,您可以在存储过程中引用临时 tables:

mysql> create procedure p() select * from t;
Query OK, 0 rows affected (0.03 sec)

mysql> create temporary table t as select 123 union select 456;
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> call p;
+-----+
| 123 |
+-----+
| 123 |
| 456 |
+-----+

(在 MySQL 5.6.31 上测试)

但是,如果大多数有经验的 MySQL 用户使用复制,他们会尽量避免执行您计划的操作。原因是当一个从站出于任何原因重新启动时,它会丢弃任何临时 tables。因此,任何后续 UPDATEINSERT...SELECT 引用临时 table 都会出错,因为临时 table 不再存在。复制流中的错误停止复制。

slave 突然重启似乎并不常见,但如果您的应用程序经常创建临时 tables,则很有可能存在临时 table 在奴隶重新启动的那一刻。

temp tables 的最佳用途是在 one 语句中用临时数据填充它们,然后仅通过 SELECT 查询(未复制)。