从 mysql table 中删除重复记录

Remove duplicate records from mysql table

我正在尝试从 mysql table 中删除一些重复的记录,但它不起作用。

我正在寻求https://www.javatpoint.com/mysql-delete-duplicate-records

的帮助

如果我尝试使用示例数据库,它工作正常。

但在我的 table 中它不起作用。

DELETE  S1 FROM employee_attendance AS S1 INNER JOIN employee_attendance AS S2 WHERE S1.DbKey < S2.DbKey AND S1.DivisionDbKey = S2.DivisionDbKey AND S1.Date = S2.Date AND S1.Month = S2.Month AND S1.FinancialYearDbKey = S2.FinancialYearDbKey AND S1.EmployeeDbKey = S2.EmployeeDbKey AND S1.Attendance = S2.Attendance  AND S1.InTime = S2.InTime  AND S1.OutTime = S2.OutTime AND S1.EmployeeDbKey = 6798 AND S1.Month = '05' AND S1.FinancialYearDbKey = 5;  

我遇到错误

#1205 - 超过锁定等待超时;尝试重新启动交易

我试过另一个例子https://www.geeksforgeeks.org/sql-query-to-delete-duplicate-rows/

DELETE FROM employee_attendance WHERE DbKey NOT IN (SELECT MAX(DbKey) FROM employee_attendance WHERE EmployeeDbKey = 6798 AND Month = '05' AND FinancialYearDbKey = '5' GROUP BY DivisionDbKey,Date,Month,FinancialYearDbKey,EmployeeDbKey,Attendance,InTime,OutTime)

我遇到同样的错误。

#1205 - 超过锁定等待超时;尝试重新启动交易

任何建议都会被采纳。谢谢。

我个人认为这是一种不好的做法。您应该制作 table employee_attendance 的(空)副本,然后在新的 table 上定义 UNIQUE KEY 以防止重复条目。

考虑以下步骤:

  1. 创建一个副本table:
CREATE TABLE employee_attendance_new LIKE employee_attendance;
  1. Add UNIQUE INDEX - 现在,这只是一个简单的例子。您可以向唯一索引添加或减少列,但请确保先删除现有的唯一索引,然后再删除 re-create:
ALTER TABLE employee_attendance_new 
      ADD UNIQUE INDEX unq_idx(EmployeeDbKey, date, InTime, OutTime);
  1. 使用 INSERT IGNORE..:
  2. 将数据插入新的 table
INSERT IGNORE INTO employee_attendance_new 
 SELECT * FROM employee_attendance;
  1. 检查并比较两者 table。如果您对结果满意,请将这些 table 重命名为:
RENAME TABLE employee_attendance TO employee_attendance_old;
RENAME TABLE employee_attendance_new TO employee_attendance;
  1. 现在您有了没有重复的新 table 和旧的 table 以供参考或以防您需要从中获取一些数据。

Fiddle example