mariadb 从mysql表中删除重复记录

8oomwypt  于 2022-11-08  发布在  Mysql
关注(0)|答案(1)|浏览(184)

我试图从mysql表中删除一些重复的记录,但它不工作。x1c 0d1x
我正在接受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 -超过锁定等待超时;尝试重新启动事务

如有任何建议,我们将不胜感激。谢谢。

woobm2wo

woobm2wo1#

我个人认为这是一个不好的做法。你应该做一个(空的)表employee_attendance的副本,然后在这个新表上定义一个UNIQUE KEY,这样可以防止重复条目。
请考虑以下步骤:
1.创建重复表:

CREATE TABLE employee_attendance_new LIKE employee_attendance;

1.添加UNIQUE INDEX-现在,这只是一个简单的例子。您可以添加或减少唯一索引的列,但请确保先删除现有的唯一索引,然后才重新创建:

ALTER TABLE employee_attendance_new 
      ADD UNIQUE INDEX unq_idx(EmployeeDbKey, date, InTime, OutTime);

1.使用INSERT IGNORE..将数据插入到新表中:

INSERT IGNORE INTO employee_attendance_new 
 SELECT * FROM employee_attendance;

1.检查并比较这两个表。如果对结果满意,请重命名这些表:

RENAME TABLE employee_attendance TO employee_attendance_old;
RENAME TABLE employee_attendance_new TO employee_attendance;

1.现在,您有了一个没有重复项的新表和一个用于参考的旧表,或者如果您需要从旧表中获取一些数据,则可以使用旧表。
Fiddle example

相关问题