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;
`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;
`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
SELECT *
FROM test
GROUP BY pid, sid
HAVING count( 1 ) >=1
这时 tmp 表里的数据就没有重复的了
接着,删除 test 表,再把 tmp 表改名为 test 就大功告成!
注:改成 UNIQUE KEY `psid` (`pid`,`sid`) 以后,插入数据时,重复的将无法插入。
在这里 主键和唯一索引的有啥区别不?为啥复合主键了还有重复数据啊。。
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条都能插入
为何不将pid和sid设置为PRIMARY呢?