2012-04-17 94 views
3

是否有MySQL命令可以刪除除單個表中的第一個索引之外的所有額外索引,從而僅保留主索引?MySQL命令刪除表中的所有非主索引

我可以使用下面的MySQL命令刪除第二個Post_Date索引,但是我在刪除其餘所有內容時遇到問題。

mysql_query("ALTER TABLE $TableName DROP INDEX Post_Date"); 

額外POST_DATEPost_Date_x指標在腳本的開始創建的,所以我想在在腳本的末尾使用MySQL命令腳本的末尾刪除它們。

記住_xPost_Date_x和變化,可以去從1到10,或從1到100這樣一個循環或IF可能需要聲明。

MySQL命令將成爲PHP腳本的一部分

謝謝你的時間。

Action Keyname Type Unique Packed Column Cardinality Collation Null Comment 
Edit Drop PRIMARY BTREE Yes No id 830 A  
Edit Drop Post_Date BTREE Yes No Post_Date 830 A  
Edit Drop Post_Date_2 BTREE Yes No Post_Date 830 A  
Edit Drop Post_Date_3 BTREE Yes No Post_Date 830 A  
Edit Drop Post_Date_4 BTREE Yes No Post_Date 830 A  
Edit Drop Post_Date_5 BTREE Yes No Post_Date 830 A  
Edit Drop Post_Date_6 BTREE Yes No Post_Date 830 A  
Edit Drop Post_Date_7 BTREE Yes No Post_Date 830 A  
Edit Drop Post_Date_8 BTREE Yes No Post_Date 830 A 
+0

檢查我的回答這個問題http://stackoverflow.com/a/16200754/757850 – 2013-04-24 19:42:54

回答

4

這應該做到這一點 -

$res = mysql_query("SHOW INDEX FROM `$TableName` WHERE `Key_name` LIKE 'Post_Date%'"); 

while ($row = mysql_fetch_object($res)) { 
    mysql_query("DROP INDEX `{$row->Key_name}` ON `{$row->Table}`") or die(mysql_error()); 
} 
+0

謝謝,但它沒有奏效。我將代碼複製到我的PHP腳本中,並且在運行時沒有收到錯誤,但沒有刪除任何索引。 – Sammy 2012-04-17 09:53:23

+0

SHOW INDEX FROM'$ TableName' WHERE'Key_name' LIKE'Post_Date%'部分顯示所有索引,但while循環不會刪除它們。 – Sammy 2012-04-17 10:17:29

+0

我的示例中出現錯誤。我已糾正它並添加了一些調試代碼。 – nnichols 2012-04-17 12:29:44

0

對不起,但沒有MySQL的命令爲ALTER TABLE ny_table DROP ALL INDEXES EXCEPT PRIMARY KEY

您將不得不爲創建時每個索引創建一個特定的名稱,然後創建一個循環爲每個使用相同名稱的索引單獨運行ALTER TABLE ... DROP INDEX SQL命令。

另請注意,創建索引相當昂貴 - 除非您正在執行>〜200個由索引優化的查詢,否則創建和刪除索引所需的時間可能會比使用索引保存的時間多。

+0

那麼有沒有mysql命令來獲取** **剛剛的鍵名?這樣我可以編寫一個循環來刪除它們。我試過$ posting_date ='Post_Date _'。$ i; mysql_query(「SHOW INDEX FROM $ TableName WHERE KEY_NAME ='$ posting_date'」);但這不起作用 – Sammy 2012-04-17 04:25:41

+0

@sammy,我不知道爲什麼這個查詢不適合你。這個對我有用。 'create table foo(int,b int);在foo(a)上創建索引idx1;在foo(b)上創建索引idx2;顯示來自foo的索引,其中Key_name ='idx1';' – 2012-04-17 04:54:38

+0

@Keith Randall,我不明白你所說的查詢。我知道如何刪除單個索引,但是我想要一個循環語句來完成它。我試過($ i = 1;; $ i ++){post_date ='Post_Date _'。$ i; $ index_exists = mysql_query(「SHOW INDEX FROM $ TableName WHERE KEY_NAME ='$ posting_date'」);如果($ index_exists> 0){mysql_query(「ALTER TABLE $ TableName DROP INDEX $ posting_date」);} else {break;} }但它失敗 – Sammy 2012-04-17 05:01:45