我有这样一张桌子:
id c1 c21 5 abc2 5 abc3 2 xyz4 2 xyz5 68 sdf我想删除c1和amp;中的行c2相同(即id为2和4的行)
编辑:我……
的 只是 强> ,删除重复的行并保持最低的ID
DELETE t1 FROM jobs j1 NNER JOIN jobs j2 WHERE j1.id > j2.id AND j1.c1 = j2.c1 AND j1.c2 = j2.c2;
然后加 UNIQUE index 限制重复的条目
UNIQUE index
CREATE UNIQUE INDEX INDX_restrict_duplicate ON jobs(c1,c2);
我假设表名是foobar,而c1和c2不可为空。
此查询将选择副本
select d.* from ( select c1 ,c2 , count(*) as cnt , min(id) as mid from foobar group by c1,c1 ) as e join foobar d on d.c1=e.c1 and d.c2=e.c2 and d.id > e.mid ;
您必须创建一个临时表,其中包含要删除的所有ID的列表。
create table bad_id_foobar as select d.id from ( select c1 ,c2 , count(*) as cnt , min(id) as mid from foobar group by c1,c1 ) as e join foobar d on d.c1=e.c1 and d.c2=e.c2 and d.id > e.mid ;
此查询将删除副本
delete from foobar where id in ( select b.id from bad_id_foobar b );
这可以通过三个步骤实现。
INSERT INTO tmp (`c1`, `c2`) SELECT c1, c2 FROM jobs GROUP BY c1, c2
DROP TABLE job
ALTER TABLE job RENAME job_archived
ALTER TABLE tmp RENAME job
这就是我如何做这样的任务。可能有更好的方法来做同样的事情......干杯!