2010-07-19 19 views
5

我創建一個臨時表,像這樣的查詢:將索引傳遞給常規表中的臨時表?

​​

但regular_table對一些領域的FULLTEXT索引。我嘗試在新的臨時表上執行FULLTEXT搜索,並且出現錯誤,告訴我「無法找到與列表列表匹配的FULLTEXT索引」。所以很明顯,索引不會複製到新表中。有沒有辦法強制這個?

謝謝。

回答

10

你可以使用CREATE TEMPORARY TABLE temp_table LIKE regular_table,但將創造所有的指標,所以當你INSERT INTO temp_table SELECT * FROM regular_table,該指標將被重建 - 這可能是漫長的。

或者,您可以創建表,之後添加索引:

CREATE TEMPORARY TABLE temp_table 
ALTER TABLE temp_table ADD FULLTEXT INDEX (foo,bar,baz) 
INSERT INTO temp_table SELECT * FROM regular_table 

但該指數將再次更新每一次插入。

可能是最有效的方法是創建臨時表,插入所有,然後建造指數:

CREATE TEMPORARY TABLE temp_table 
ALTER TABLE temp_table ADD FULLTEXT INDEX (foo,bar,baz) 
ALTER TABLE temp_table DISABLE KEYS 
INSERT INTO temp_table SELECT * FROM regular_table 
ALTER TABLE temp_table ENABLE KEYS 

同樣,你將不得不等待索引建立,但它會在一個發生大塊,最後一個ALTER語句。

+0

謝謝!這可能是一個小小的忽略,但我相信你必須把'ALTER TABLE tablename'我得到一個錯誤,只是'ALTER tablename' ..感謝您的信息! – 2010-07-19 14:55:01

+0

@John Isaacks:不客氣,感謝糾正 - 編輯。 – Piskvor 2010-07-19 15:15:09

2

臨時表與其他表完全相同,只不過它會在會話結束時被刪除。具有相同索引(來自數據庫內)的唯一方法是與其他表一樣在表上創建它們。

現在有點破解了。您可以將磁盤上的物理文件複製到一個新的名稱,並擁有包含索引的表格的副本,但我假設您在應用程序中執行此操作,因此可能不太實際。

+0

注意:這隻適用於MyISAM(不是InnoDB或其他),並且可能需要root權限。 – Piskvor 2010-07-19 14:28:55