我有表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
答案 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'
结论:我们所做的是正确的。