2011-11-18 38 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 |