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

Php MySQL命令删除表的所有非主索引,php,mysql,indexing,sql-drop,Php,Mysql,Indexing,Sql Drop,是否有一个MySQL命令可以除去单个表中的第一个索引之外的所有额外索引,从而只保留主索引 我可以使用下面的MySQL命令删除第二个Post_Date索引,但是删除其余的索引时遇到问题 mysql_query("ALTER TABLE $TableName DROP INDEX Post_Date"); 额外的Post_Date和Post_Date_x索引是在脚本开头创建的,因此我想在脚本末尾使用MySQL命令删除它们 请记住,\u x在日期后的~200个查询,否则创建和删除索引可能需要比使用它

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

我可以使用下面的MySQL命令删除第二个Post_Date索引,但是删除其余的索引时遇到问题

mysql_query("ALTER TABLE $TableName DROP INDEX Post_Date");
额外的Post_DatePost_Date_x索引是在脚本开头创建的,因此我想在脚本末尾使用MySQL命令删除它们

请记住,\u 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   

抱歉,没有MySQL comand for
ALTER TABLE ny\u TABLE除去主键以外的所有索引

您必须在创建每个索引时为其创建一个特定的名称,然后创建一个循环来单独运行
altertable。。。使用相同名称为每个索引删除索引
SQL命令

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

这应该可以做到-

$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());
}

那么,是否有一个Mysql命令只检索关键字?这样我就可以写一个循环来删除它们。我尝试了$posting\u date='Post\u date.$I;mysql_查询(“显示来自$TableName的索引,其中KEY_NAME='$posting_date'”);但事实并非如此work@sammy,我不知道为什么这个查询对你不起作用。它对我有用<代码>创建表foo(a int,b int);在foo(a)上创建索引idx1;在foo(b)上创建索引idx2;显示来自foo的索引,其中Key_name='idx1'@Keith Randall,我不明白你在说什么。我知道如何删除单个索引,但我希望有一个循环语句可以做到这一点。我尝试了($I=1;;$I++){$posting_date='Post_date'.$I;$index_exists=mysql_query(“从$TableName中显示索引,其中KEY_NAME='$posting_date'”);如果($index_exists>0){mysql_query($ALTER TABLE$TableName DROP index$posting_date”);否则{break;}但它失败了,谢谢你,但它不起作用。我将代码复制到我的PHP脚本中,运行时没有出现错误,但它没有删除任何索引。来自
$TableName
的SHOW索引,其中
Key\u name
类似于'Post\u Date%'部分显示所有索引,但while循环没有删除它们。我的示例中有一个错误。我已经纠正了它,并添加了一些调试代码。它工作得很好。非常感谢你。我真的很感激。顺便问一下,您是否知道如何确定表中的索引数,因为只有当索引数大于1时,我才需要运行此脚本。例如,如果(索引数>1){运行脚本},则不值得单独进行检查。只有在相关指数存在的情况下,这才会起作用。请记住接受回答您问题的答案。只需单击首选答案旁边的勾号。检查我对该问题的回答