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