【问题标题】:Calling stored procedures on temporary tables在临时表上调用存储过程
【发布时间】:2017-12-04 16:03:17
【问题描述】:

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

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

  1. 将数据加载到临时表newdata
  2. 在对表 newdata 进行修改和更新的地方调用存储过程
  3. 存储过程将数据从newdata 移动到实时/永久表中。

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

【问题讨论】:

  • 是的,这应该是可能的

标签: mysql temp-tables


【解决方案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 都会出错,因为临时表不再存在。复制流中的错误会停止复制。

slave 突然重启似乎并不常见,但如果您的应用频繁创建临时表,则很有可能在 slave 重启时出现临时表。

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

【讨论】:

  • 谢谢,比尔。在复制方面也有好的想法/建议......我没有考虑过。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
相关资源
最近更新 更多