我正在尝试找出数据迁移的最佳方法。
我正在从一个表中迁移一些数据(大约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;保留主键并不重要。
"location“中的地址重复多次。在大多数情况下具有相同的纬度和经度。但在某些情况下,有些行的addr值相同,但纬度和经度值不同。
最终的location2表应该为位置中的每个唯一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 ... ;来迁移数据。
谢谢!
发布于 2010-09-03 09:13:26
您可以直接使用INSERT IGNORE,或者REPLACE -我假设这是一个一次性的过程,或者至少是一个性能不是主要考虑因素的过程。
在这种情况下,具有最高location_id的记录将获胜:
INSERT IGNORE
INTO location2
SELECT *
FROM location
ORDER BY
location_id DESC主键值相同的后续记录将被insert丢弃。
您需要禁用严格的SQL模式,否则地址字段的截断将给出错误。
https://stackoverflow.com/questions/3632350
复制相似问题