Andy's Blog » » MySQL 删除重复记录

MySQL 删除重复记录

更新:没想到 SELECT DISTINCT 也能用在这里,还以为多对多的时候不行,最简单的办法就是

INSERT INTO tmp SELECT DISTINCT * FROM test

今天终于解决了一个难题
有个表结构如下

CREATE TABLE IF NOT EXISTS `test` (
 
`pid` int(11) NOT NULL,
 
`sid` int(11) NOT NULL,
 
KEY `psid` (`pid`,`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

当时设计的时候不合理,应该做成唯一的联合索引
现在表里有大量的重复数据,为了删除它,费了我一番工夫

解决办法如下:
先建一个临时表,结构和 test 一样,但用的是唯一联合索引

CREATE TABLE IF NOT EXISTS `tmp` (
 
`pid` int(11) NOT NULL,
 
`sid` int(11) NOT NULL,
 
UNIQUE KEY `psid` (`pid`,`sid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

然后

INSERT INTO tmp
SELECT *
FROM test
GROUP BY pid, sid
HAVING count( 1 ) >=1

这时 tmp 表里的数据就没有重复的了

接着,删除 test 表,再把 tmp 表改名为 test 就大功告成!

注:改成 UNIQUE KEY `psid` (`pid`,`sid`) 以后,插入数据时,重复的将无法插入。

Incoming search terms:

Tags: mysql, 删除, 重复

本文地址: http://blog.21andy.com/20100307/1739.html

3 评论 to “PHP开源CMS之MODx”

  1. airwin 于 2010-03-07 14:05:10 发表:

    在这里 主键和唯一索引的有啥区别不?为啥复合主键了还有重复数据啊。。

    Andy 于 2010-03-07 14:19:10 回复:

    注意 KEY 和 UNIQUE KEY 不一样,KEY只是索引
    你试着建个表试下就知道了,运行这句SQL试试
    INSERT INTO test VALUES(1,2),(1,2),(1,3);
    如果用 UNIQUE KEY, 将只会插入 1,2 和 1,3
    而 KEY,将会3条都能插入

  2. kokko 于 2010-03-20 00:32:24 发表:

    为何不将pid和sid设置为PRIMARY呢?