MySQL作為廣泛使用的一個(gè)開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),臨時(shí)表也是其中一項(xiàng)重要的特性之一。臨時(shí)表可以用來(lái)存儲(chǔ)臨時(shí)的數(shù)據(jù)集合,通常情況下是在查詢(xún)數(shù)據(jù)的過(guò)程中進(jìn)行使用。在MySQL中,我們可以使用CREATE TEMPORARY表名()的語(yǔ)法創(chuàng)建臨時(shí)表。然而,有時(shí)候在創(chuàng)建完臨時(shí)表之后,我們無(wú)法立即查詢(xún)到這些表中的數(shù)據(jù),這究竟是為什么呢?
CREATE TEMPORARY TABLE temp_table( id INT PRIMARY KEY, name VARCHAR(20) ); INSERT INTO temp_table(id, name) VALUES(1, 'Tom'), (2, 'John'), (3, 'Lucy');
在上述的代碼中,我們創(chuàng)建了一個(gè)名為“temp_table”的臨時(shí)表,并插入了三條數(shù)據(jù)記錄。但是,如果我們?cè)趧?chuàng)建完成之后立即查詢(xún)這個(gè)臨時(shí)表的數(shù)據(jù),就會(huì)發(fā)現(xiàn)MySQL報(bào)錯(cuò)了。報(bào)錯(cuò)信息為:Table 'temp_table' doesn't exist。
這是因?yàn)榕R時(shí)表在創(chuàng)建完成之后,并不會(huì)立即將這個(gè)臨時(shí)表保存到內(nèi)存中,而是等待當(dāng)前事務(wù)結(jié)束之后才會(huì)被銷(xiāo)毀。在該事務(wù)中,MySQL會(huì)將這個(gè)臨時(shí)表的定義存儲(chǔ)在臨時(shí)庫(kù)中,并給該表取一個(gè)名字,此時(shí)我們就可以使用這個(gè)名字來(lái)操作這個(gè)臨時(shí)表。而如果直接查詢(xún)這個(gè)臨時(shí)表,由于它還沒(méi)有被保存到內(nèi)存中,因此會(huì)出現(xiàn)上述的報(bào)錯(cuò)信息。
為了避免出現(xiàn)上述的問(wèn)題,在創(chuàng)建完臨時(shí)表之后,我們可以先提交事務(wù),或者退出當(dāng)前事務(wù),再查詢(xún)這個(gè)臨時(shí)表的數(shù)據(jù)。這樣就可以保證臨時(shí)表已經(jīng)被保存到內(nèi)存中,可以被正確地訪問(wèn)到了。