1

我有一个MySQL存储例程,我想在其中使用临时数据表来存储中间结果。为了避免必须创建一个“普通”表,我想使用一个在例程执行完成后消失的内存表。我是 MySQL 新手,但我想这是要走的路:

DROP TABLE IF EXISTS MyInMemoryTable;
CREATE TABLE MyInMemoryTable ( numberField int ) ENGINE = MEMORY;
...
DROP TABLE IF EXISTS MyInMemoryTable;

我的例程适用于单个用户,但我担心如果多个用户同时运行例程会发生什么?

每个执行例程的用户会话是否是MyInMemoryTable 本地的,因此可以同时存在该表的许多实例(没有冲突)?还是为所有用户MyInMemoryTable提供一个全局表,从而冒着不同用户的数据在表中混淆的风险?或者如果另一个用户正忙于运行例程,一个用户是否会面临数据库错误的风险?

对我来说,文档令人困惑:它说MEMORY引擎将每个表与磁盘文件相关联,而且“MEMORY表永远不会转换为磁盘表”。

我是否误解了 MySQL 内存表?也许有更好的方法?

4

2 回答 2

3

创建一个临时表。

CREATE TEMPORARY TABLE ...;

这些表不共享,并在您的连接结束时被删除。

内存表中的标准可能是共享的和全局的。

于 2011-11-18T08:27:24.780 回答
0

这是两个不同的概念:表引擎和表临时属性。理论上,任何引擎的表都可以是临时的(InnoDB、MyISAM、Memory)。内存引擎可能是 MySQL 中最不为人知的存储引擎。在引擎盖下,它是一个逐渐增长的哈希图。所以,是的,内存中的表可以是会话本地的——但它们必须是临时的:

mysql> show create table tmp; CREATE TEMPORARY TABLE `tmp` (   `a` int(11) DEFAULT NULL ) ENGINE=MEMORY DEFAULT CHARSET=latin1 | 1 row in set (0.00 sec)

mysql> drop table tmp; Query OK, 0 rows affected (0.01 sec)

mysql> show create table tmp; CREATE TABLE `tmp` (   `example` int(11) NOT NULL,   `id` int(11) NOT NULL AUTO_INCREMENT,   PRIMARY KEY (`example`),   UNIQUE KEY `id` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=latin1 |
于 2015-04-16T07:16:48.243 回答