为了防止重复记录,常见的方法是在相关表列上创建唯一索引。然而,最近的一个错误导致创建了一个普通索引,从而允许重复项保留在一个包含 2000 万条记录的庞大表中。
问题: 是否会将现有索引修改为唯一或添加这些列的新唯一索引会删除重复记录,还是会因现有唯一条目而导致操作失败?
答案:
使用 IGNORE 添加唯一索引修饰符将删除重复记录:
<code class="sql">ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);</code>
但是,此修饰符在 MySQL 5.7.4 及更高版本中已弃用,从而导致错误。要避免此问题,可以采取以下步骤:
创建一个临时表来保存原始表中的数据:
<code class="sql">CREATE TABLE tmp_data SELECT * FROM mytable;</code>
截断原表:
<code class="sql">TRUNCATE TABLE mytable;</code>
在原表上创建唯一索引:
<code class="sql">ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);</code>
将数据复制回来到原始表中,同时忽略重复行:
<code class="sql">INSERT IGNORE INTO mytable SELECT * from tmp_data;</code>
删除临时表:
<code class="sql">DROP TABLE tmp_data;</code>
或者,添加唯一索引如果没有 IGNORE 修饰符将导致查询失败并出现错误 1062(重复键)。
以上是**可以通过将现有索引修改为唯一索引或添加新索引来删除重复记录吗?**的详细内容。更多信息请关注PHP中文网其他相关文章!