有没有办法根据两个字段删除重复记录?
我有一个人们可以注册体育赛事的系统。在表格中:
event_registrations
•unique_id
•eventname
•id(人的身份证号码)
•姓名和姓氏
一个人可以申请许多活动 - 身份证可以复制
一个事件可能有多个参与者 - 事件名可能重复:
--Johnsmith-- --Mountain Cycle--
--Johnsmith-- --Marathnon Walk--
--Linda-- --Mountain Cycle--
--Johnsmith-- --Mountain Cycle--
但是,某人可能无法注册他们已注册的活动:
--Johnsmith-- --Mountain Cycle--
--Johnsmith-- --Mountain Cycle--
他们通过表单选择一个事件名称。然后,表单数据及其用户详细信息存储在表event_registrations中。
任何帮助将不胜感激
答案 0 :(得分:2)
首先删除任何包含重复(eventname, id)
组合的行。
然后添加UNIQUE约束:
ALTER TABLE yourTable
ADD CONSTRAINT eventname_person_Unique
UNIQUE INDEX eventname_id_U
(eventname, id) ;
应该相应调整添加注册的表单,以便在重复行被拒绝时处理从MySQL获得的错误。
答案 1 :(得分:0)
正如ypercube建议的那样,UNIQUE INDEX
是防止这种情况发生的方法。要识别/删除现有的重复项,您可以使用:
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
)
)
)
答案 2 :(得分:0)
如果你需要在添加唯一约束之前做一些数据整理,那么你可以使用以下(一个很好的理由,为什么总是有一个唯一的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;