是否有方法删除基于两个字段的重复记录?
我有一个人们可以注册体育赛事的系统。表中:
event_registrations
•unique_id
•eventname
•id(个人身份证号)
•姓名
一个人可以申请多个活动- id可能会重复一个事件可以有多个参与者- eventname可以重复:
--Johnsmith-- --Mountain Cycle--
--Johnsmith-- --Marathnon Walk--
--Linda-- --Mountain Cycle--
--Johnsmith-- --Mountain Cycle--
但是一个人不能注册他已经注册的事件:
--Johnsmith-- --Mountain Cycle--
--Johnsmith-- --Mountain Cycle--
他们通过表单选择事件名称。然后表单数据及其用户详细信息存储在event_registrations表中。
如有任何帮助,不胜感激
首先删除所有具有重复(eventname, id)
组合的行。
然后添加UNIQUE约束:
ALTER TABLE yourTable
ADD CONSTRAINT eventname_person_Unique
UNIQUE INDEX eventname_id_U
(eventname, id) ;
添加注册的表单应该相应地进行调整,以处理当拒绝重复行时从MySQL获得的错误。
UNIQUE INDEX
是防止这种情况的方法,正如supercube所建议的那样。要识别/删除已存在的重复项,您可以使用:
SELECT
eventname,
id -- You should consider using a less ambiguous name here
FROM
Event_Registrations ER1
WHERE
EXISTS (
SELECT *
FROM Event_Registrations ER2
WHERE
ER2.eventname = ER1.eventname AND
ER2.id = ER1.id AND
(ER2.registration_datetime < ER1.registration_datetime OR
(ER2.registration_datetime = ER1.registration_datetime AND
ER2.unique_id < ER1.unique_id
)
)
)
如果您需要在添加唯一约束之前做一些数据整理,那么您可以使用以下(一个很好的理由,为什么总是有一个唯一的id列是一个好主意):
create table id_for_deletion (id int unsigned not null);
insert into id_for_deletion (id)
(
select a.delete_me_id
from (
select eventname,id,max(unique_id) as delete_me_id
from event_registrations
group by eventname,id
having count(*) > 1
) a);
delete from event_registrations where unique_id in (select id from id_for_deletion);
drop table id_for_deletion;