I have a table location
that contains duplicate records I need to remove. There are two other tables img_locationShown
and img_locationCreated
that both reference the location
table. So as well as removing the duplicates from location
I also need to update these two tables so any rows in these tables referencing a duplicate row in location
are updated.
I’ve come up with a procedure to do this, it seems to work okay, but I’m not sure if there’s a better way to do this, or any potential problems with the below?
DELIMITER //
DROP PROCEDURE IF EXISTS remove_location_dupes//
CREATE PROCEDURE remove_location_dupes()
BEGIN
DECLARE id, Sublocation, City, ProvinceState, country, WorldRegion INT;
DECLARE done INT DEFAULT 0;
DECLARE cur1 CURSOR FOR SELECT location.id, location.Sublocation, location.City, location.ProvinceState, location.country, location.WorldRegion FROM location;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur1;
# Disable Foreign Key Constraints so we can empty the location table
SET foreign_key_checks = 0;
# Truncate location table
TRUNCATE TABLE location;
# Loop through location table
the_loop: LOOP
FETCH cur1 INTO id, Sublocation, City, ProvinceState, country, WorldRegion;
IF done THEN
SET foreign_key_checks = 1;
CLOSE cur1;
LEAVE the_loop;
END IF;
# Try inserting the location into the location table
INSERT IGNORE INTO location SET location.Sublocation = Sublocation, location.City = City, location.ProvinceState = ProvinceState, location.country = country, location.WorldRegion = WorldRegion;
IF LAST_INSERT_ID()
THEN
# Update img_locationShown and img_locationCreated with the correct location id
UPDATE img_locationShown SET img_locationShown.location_id = LAST_INSERT_ID() WHERE img_locationShown.location_id = id;
UPDATE img_locationCreated SET img_locationCreated.location_id = LAST_INSERT_ID() WHERE img_locationCreated.location_id = id;
END IF;
END LOOP the_loop;
END
//
DELIMITER ;
Thanks
Dave