从mysql中删除重复条目而不应用唯一键

时间:2018-04-25 12:19:31

标签: mysql sql

我找到了一张人的桌子,从一开始就包含重复的人。遗憾的是,有时数据会挂钩到重复项中的一个或另一个,因此我宁愿保留它们,因为这些记录不是问题的一部分,删除这些记录会导致更多问题。

有人在2天前更新了用户创建代码,最终产生了大量的重复数据(数千个)。我需要删除过去2天内的所有重复项。我无法使用“唯一密钥方法”,因为较旧的重复项附加了数据(预订等)。 有谁知道如何解决这样的问题?我明确地想要删除最近2天的重复项,在表中留下每个人的1份副本。 yourClient.fetchAll() .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .toObservable() .flatMapIterable(movies -> movies) .flatMap(movie -> yourClient.fetchByMovieId(movie.getId())) .toList() .subscribe()...

可以使用以下列来检查记录是否重复: 名字,姓氏,出生日期,出生地,birth_country

2 个答案:

答案 0 :(得分:0)

在这种情况下,您可以创建另一个具有相同模式的表,并在此表中创建一个组合的唯一列:firstname, lastname, birthdate, birthplace, birth_country

现在,您可以使用存储过程或自定义程序将第一个表中的数据写入新表。之后,从旧表中删除2天数据,并将新表中的数据存储到旧表中。

答案 1 :(得分:0)

DELETE MAIN_TABLE
FROM people_copy as CHILD, people_copy as MAIN_TABLE
WHERE
          (CHILD.company_id   = MAIN_TABLE.company_id OR CHILD.company_id IS NULL AND MAIN_TABLE.company_id IS NULL)
      AND (CHILD.firstname = MAIN_TABLE.firstname OR CHILD.firstname IS NULL AND MAIN_TABLE.firstname IS NULL)
      AND (CHILD.lastname = MAIN_TABLE.lastname OR CHILD.lastname IS NULL AND MAIN_TABLE.lastname IS NULL)
      AND CHILD.ID < MAIN_TABLE.ID AND CHILD.created_at > DATE_ADD(SYSDATE(),INTERVAL -2 DAY);

在这里,您可以自行加入该表并比较要比较的列数。 这会对你有所帮助。 You can check SQL Fiddle demo