在临时表上调用存储过程

时间:2017-12-04 16:03:18

标签: mysql temp-tables

是否可以在MySQL中的临时表上执行存储过程?我试图创建一个数据导入系统,理论上可以为不同的用户同时运行。如果一个用户正在将文件导入临时表而另一个用户正在执行相同的操作,那么两个用户是否可以调用相同的共享过程,因为过程中引用的表将与临时表匹配?

单个用户的工作流程看起来像这样......

  1. 将数据加载到临时表newdata
  2. 调用存储过程,对表newdata
  3. 进行重新设置和更新
  4. 存储过程将数据从newdata移动到实时/永久表。
  5. ......而另一个用户可能会做同样的事情。

1 个答案:

答案 0 :(得分:1)

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

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用户试图避免做他们正在计划的事情,如果他们使用复制。原因是当从属设备因任何原因重新启动时,它会丢弃任何临时表。因此,引用临时表的任何后续UPDATEINSERT...SELECT都会收到错误,因为临时表不再存在。复制流中的错误会停止复制。

看起来这对于奴隶突然重启应该是不常见的事情,但是如果你的应用经常创建临时表,那么在奴隶重启的那一刻,临时表很可能会出现

临时表的最佳用法是在一个语句中填充临时数据,然后仅通过SELECT查询(未复制)使用临时表。