如何使用PHP和MySQLi创建及删除MySQL表索引(以region列为例)
PHP+MySQLi 实现索引删除与重建代码
首先修正基础连接代码的笔误:原代码中连接返回的变量是$link,但设置字符集时误用了$con,已在实现代码中统一修正为一致的变量名。
完整实现代码
<?php // 数据库连接配置,替换为你实际的配置值 define('db_host', '你的数据库地址'); define('db_user', '你的数据库用户名'); define('db_pass', '你的数据库密码'); define('db_pools', '你的数据库名'); // 建立连接 $link = mysqli_connect(db_host, db_user, db_pass, db_pools); if (!$link) { die("数据库连接失败: " . mysqli_connect_error()); } mysqli_set_charset($link, "utf8"); // 替换为你实际操作的新表名 $target_table = '替换为你的目标表名'; // -------------------------- // 第一步:删除表中所有原有索引 // -------------------------- // 查询所有索引,如需保留主键索引,可在WHERE条件中加 AND KEY_NAME != 'PRIMARY' $index_query = "SELECT KEY_NAME FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = '".db_pools."' AND TABLE_NAME = '".$target_table."'"; $index_result = mysqli_query($link, $index_query); if ($index_result) { $index_list = []; while ($row = mysqli_fetch_assoc($index_result)) { // 索引名去重,避免重复执行删除操作 if (!in_array($row['KEY_NAME'], $index_list)) { $index_list[] = $row['KEY_NAME']; } } // 循环删除所有索引 foreach ($index_list as $index_name) { $drop_sql = "DROP INDEX `{$index_name}` ON `{$target_table}`"; if (!mysqli_query($link, $drop_sql)) { echo "删除索引{$index_name}失败: " . mysqli_error($link) . "<br>"; } else { echo "删除索引{$index_name}成功<br>"; } } mysqli_free_result($index_result); } else { die("查询表索引失败: " . mysqli_error($link)); } // -------------------------- // 此处插入你对新表的编辑操作逻辑 // -------------------------- // -------------------------- // 第二步:新建region列索引 // -------------------------- // 如需创建唯一索引,将语句改为CREATE UNIQUE INDEX即可 $add_index_sql = "CREATE INDEX idx_region ON `{$target_table}` (`region`)"; if (mysqli_query($link, $add_index_sql)) { echo "新建region列索引成功<br>"; } else { echo "新建region列索引失败: " . mysqli_error($link) . "<br>"; } // 关闭数据库连接 mysqli_close($link); ?>
注意事项
- 代码中
$target_table变量需替换为你实际操作的新表名 - 索引名
idx_region可根据你的业务命名规则自定义,保证同表不重复即可 - 如果region列存在重复值,不要创建唯一索引,避免执行报错
- 操作大表前建议先备份表结构和数据,优先选择业务低峰期执行
内容的提问来源于stack exchange,提问作者NhlGreg
相关产品推荐
相关产品推荐

