2010-09-03 43 views
2

我正在嘗試制定數據遷移的最佳方法。將具有dupe的MySQL表遷移到具有UNIQUE約束的另一個表的最佳方法

我遷移從表中的一些數據(〜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表應該有位置中每個唯一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 ... ; 

遷移數據。

謝謝!

回答

4

您可以直接使用INSERT IGNORE或REPLACE - 我假設這是一次性過程,或者至少一個性能不是主要考慮因素。

在這種情況下,具有最高LOCATION_ID勝戰績:

INSERT IGNORE 
INTO location2 
SELECT * 
FROM location 
ORDER BY 
     location_id DESC 

後續記錄機智的相同的主鍵值只是被插入丟棄。

您需要禁用嚴格的SQL模式,否則截斷addr字段將會導致錯誤。

+0

這正是這個男人所說的。非常感謝。 – 2010-09-05 04:10:17

相關問題