2011-11-18 47 views
1

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

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

我为单个用户日常工作,但我担心如果多个用户运行在常规会发生什么同时

MyInMemoryTable本地到每个执行例程的用户会话,所以这个表可以有很多实例(没有冲突)在同一时间吗? 或者是MyInMemoryTable单一全球表为所有用户,从而冒着不同的用户的数据混在桌面?或者如果另一个用户忙于运行例程,一个用户会冒数据库错误的风险吗?

对我来说,documentation是混乱的:它说MEMORY引擎将每个表磁盘文件,而且还“MEMORY表都不会转换到磁盘表。”

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

回答

3

创建一个临时表。

CREATE TEMPORARY TABLE ...; 

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

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

+0

哦,这就是我所怀疑的。我弄错了。感谢您的帮助! – Gruber

0

这些是两个不同的概念:表引擎和表临时属性。理论上,任何引擎都可以是临时表(InnoDB,MyISAM,Memory)。 Memory engine is perhaps least understood storage engine in 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 |