MySQL:修复完全重复的行

时间:2014-11-23 16:06:06

标签: php mysql

我有表tags,我忘记在创建时将id列设置为主键。

现在我面临重复密钥问题。

tags表格:

id     text
1      man
2      ball
2      ball
2      ball
3      love
3      love
4      heart
4      heart

如何删除重复并保留并设置id作为主键?

预期结果:(新的必需tags表)

id     text
1      man
2      ball
3      love
4      heart

3 个答案:

答案 0 :(得分:2)

我认为最简单的方法是创建一个包含数据的临时表,然后重新加载数据:

create temporary table tags_temp as
    select distinct id, text
    from tags;

truncate table tags;

alter table tags add primary key (id);

insert into tags(id, text)
    select id, temp
    from tags_temp;

答案 1 :(得分:1)

我要做的是创建一个新表,添加键插入旧表中的数据,然后删除tags并重命名temp

/* Make a copy of the database table (including indexes) */
create table tags_tmp like tags;

/* Add the primary key to the table */
alter table tags_tmp add primary key (id);

/* Insert the data from the bad table and ignore any duplicates */
insert ignore into tags_tmp (id, text)
    select id, text from tags;

/* Drop the bad table */
drop table tags;

/* Rename the temporary table to the original name */
rename table tags_tmp to tags;

答案 2 :(得分:1)

首先,我创建了您的表并将数据插入:

mysql> select * from tags;
+----+-------+
| id | text  |
+----+-------+
|  1 | man   |
|  2 | ball  |
|  2 | ball  |
|  2 | ball  |
|  3 | love  |
|  3 | love  |
|  4 | heart |
|  4 | heart |
+----+-------+
8 rows in set (0.00 sec)

我仅备份不同的条目:

mysql> create table T as select distinct * from tags;
Query OK, 4 rows affected (0.27 sec)
Records: 4  Duplicates: 0  Warnings: 0

我不再需要原始表格,因此我将其从数据库中删除:

mysql> drop table tags;
Query OK, 0 rows affected (0.12 sec)

我重命名上一个备份表:

mysql> rename table T to tags;
Query OK, 0 rows affected (0.08 sec)

现在是时候将PRIMARY KEY约束添加到我们的表中了:

mysql> alter table tags add  primary key(id);
Query OK, 0 rows affected (0.48 sec)
Records: 0  Duplicates: 0  Warnings: 0

现在,让我们测试一下我们所做的是否正确。首先,让我们显示数据:

mysql> select * from tags;
+----+-------+
| id | text  |
+----+-------+
|  1 | man   |
|  2 | ball  |
|  3 | love  |
|  4 | heart |
+----+-------+
4 rows in set (0.00 sec)

让我们尝试添加id = 4的行:

mysql> insert into tags values(4,'proof');
ERROR 1062 (23000): Duplicate entry '4' for key 'PRIMARY'

结论:我们所做的是正确的。