MySQL delete duplicate records but keep latest

后端 未结 7 1442

I have unique id and email fields. Emails get duplicated. I only want to keep one Email address of all the duplicates but with the latest id<

7条回答
  •  天命终不由人
    2020-11-28 23:05

    DELIMITER // 
    CREATE FUNCTION findColumnNames(tableName VARCHAR(255))
    RETURNS TEXT
    BEGIN
        SET @colNames = "";
         SELECT GROUP_CONCAT(COLUMN_NAME) FROM INFORMATION_SCHEMA.columns
            WHERE TABLE_NAME = tableName
            GROUP BY TABLE_NAME INTO @colNames;
        RETURN @colNames;
    END // 
    DELIMITER ;
    
    DELIMITER // 
    CREATE PROCEDURE deleteDuplicateRecords (IN tableName VARCHAR(255))
    BEGIN
        SET @colNames = findColumnNames(tableName);
        SET @addIDStmt = CONCAT("ALTER TABLE ",tableName," ADD COLUMN id INT AUTO_INCREMENT KEY;");
        SET @deleteDupsStmt = CONCAT("DELETE FROM ",tableName," WHERE id NOT IN 
            ( SELECT * FROM ",
                " (SELECT min(id) FROM ",tableName," group by ",findColumnNames(tableName),") AS tmpTable);");
        set @dropIDStmt = CONCAT("ALTER TABLE ",tableName," DROP COLUMN id");
    
        PREPARE addIDStmt FROM @addIDStmt;
        EXECUTE addIDStmt;
    
        PREPARE deleteDupsStmt FROM @deleteDupsStmt;
        EXECUTE deleteDupsStmt;
    
        PREPARE dropIDStmt FROM @dropIDStmt;
        EXECUTE dropIDstmt;
    
    END // 
    DELIMITER ;
    

    Nice stored procedure I created for deleting all duplicate records of a table without needing an existing unique id on that table.

    CALL deleteDuplicateRecords("yourTableName");
    

提交回复
热议问题