MySQL命令删除表的所有非主索引

时间:2012-04-17 01:27:03

标签: php mysql indexing sql-drop

是否有一个MySQL命令可以删除除单个表中第一个以外的所有额外索引,从而只保留主索引?

我可以使用以下MySQL命令删除第二个 Post_Date 索引,但是我在删除所有其他命令时遇到了问题。

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

在脚本的开头创建了额外的 Post_Date Post_Date_x 索引,因此我想在脚本末尾使用MySQL命令删除它们。脚本结束。

请记住 __ 中的 _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   

2 个答案:

答案 0 :(得分: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());
}

答案 1 :(得分:0)

抱歉,ALTER TABLE ny_table DROP ALL INDEXES EXCEPT PRIMARY KEY没有MySQL命令。

您必须为每个索引创建一个特定的名称,然后创建一个循环,以便使用相同的名称为每个索引单独运行ALTER TABLE ... DROP INDEX SQL命令。

另请注意,创建索引相当昂贵 - 除非您正在执行>由索引优化的~200个查询,创建和删除索引可能比使用它们节省的时间更长。