3

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

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

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

额外的Post_DatePost_Date_x索引是在脚本开头创建的,所以我想在脚本末尾使用 MySQL 命令删除它们。

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

2 回答 2

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());
}
于 2012-04-17T08:27:10.683 回答
0

抱歉,没有用于ALTER TABLE ny_table DROP ALL INDEXES EXCEPT PRIMARY KEY.

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

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

于 2012-04-17T01:35:08.147 回答