2012-04-17 69 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