我正在尝试找出数据迁移的最佳方法。
我正在从这样的表中迁移一些数据(~8000 行):
CREATE TABLE location (
location_id INT NOT NULL AUTO_INCREMENT UNIQUE PRIMARY KEY,
addr VARCHAR(1000) NOT NULL,
longitude FLOAT(11),
latitude FLOAT(11)
) Engine = InnoDB, DEFAULT CHARSET=UTF8;
到这样的表:
CREATE TABLE location2 (
location_id INT NOT NULL AUTO_INCREMENT UNIQUE PRIMARY KEY,
addr VARCHAR(255) NOT NULL UNIQUE,
longitude FLOAT(11),
latitude FLOAT(11)
) Engine = InnoDB, DEFAULT CHARSET=UTF8;
保留主键并不重要。
“位置”中的地址重复了很多次。大多数情况下经纬度相同。但在某些情况下,有些行的 addr 值相同,但纬度和经度的值不同。
最终的 location2 表应该为 location 中的每个唯一 addr 条目提供一个条目。如果纬度/经度有多个可能值,则应使用最新的(最高 location_id)。
我创建了一个过程来执行此操作,但它不喜欢 addr 相同但纬度/经度不同的行。
DROP PROCEDURE IF EXISTS migratelocation;
DELIMITER $$
CREATE PROCEDURE migratelocation()
BEGIN
DECLARE done INT DEFAULT 0;
DECLARE a VARCHAR(255);
DECLARE b, c FLOAT(11);
DECLARE cur CURSOR FOR SELECT DISTINCT addr, latitude, longitude FROM location;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
OPEN cur;
REPEAT
FETCH cur INTO a, b, c;
IF NOT done THEN
INSERT INTO location2 (addr, latitude, longitude) VALUES (a, b, c);
END IF;
UNTIL done END REPEAT;
CLOSE cur;
END $$
DELIMITER ;
CALL migratelocation();
有没有好的方法来做到这一点?我一直想放弃并编写一个小的 PHP 程序来做到这一点,但如果可以的话,我宁愿学习正确的 SQL 方式。
可能我只需要从第一个表中找到正确的 SELECT 就可以使用:
INSERT INTO location2 SELECT ... ;
迁移数据。
谢谢!