在临时表上调用存储过程
Calling stored procedures on temporary tables
是否可以在 MySQL 中的临时 table 上执行存储过程?我正在尝试创建一个数据导入系统,理论上可以同时为不同用户 运行。如果一个用户正在将文件导入临时 table 而另一个用户正在做同样的事情,是否有可能两个用户都调用同一个共享过程,因为过程中引用的 tables 将匹配临时 tables?
单个用户的工作流程如下所示...
- 将数据加载到临时 table
newdata
- 在对 table
newdata
进行修改和更新时调用存储过程
- 存储过程将数据从
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。因此,任何后续 UPDATE
和 INSERT...SELECT
引用临时 table 都会出错,因为临时 table 不再存在。复制流中的错误停止复制。
slave 突然重启似乎并不常见,但如果您的应用程序经常创建临时 tables,则很有可能存在临时 table 在奴隶重新启动的那一刻。
temp tables 的最佳用途是在 one 语句中用临时数据填充它们,然后仅通过 SELECT
查询(未复制)。
是否可以在 MySQL 中的临时 table 上执行存储过程?我正在尝试创建一个数据导入系统,理论上可以同时为不同用户 运行。如果一个用户正在将文件导入临时 table 而另一个用户正在做同样的事情,是否有可能两个用户都调用同一个共享过程,因为过程中引用的 tables 将匹配临时 tables?
单个用户的工作流程如下所示...
- 将数据加载到临时 table
newdata
- 在对 table
newdata
进行修改和更新时调用存储过程
- 存储过程将数据从
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。因此,任何后续 UPDATE
和 INSERT...SELECT
引用临时 table 都会出错,因为临时 table 不再存在。复制流中的错误停止复制。
slave 突然重启似乎并不常见,但如果您的应用程序经常创建临时 tables,则很有可能存在临时 table 在奴隶重新启动的那一刻。
temp tables 的最佳用途是在 one 语句中用临时数据填充它们,然后仅通过 SELECT
查询(未复制)。