2009-09-30 153 views
4

我正在從一個系統遷移到另一個系統,在此過程中,我將同時運行這兩個系統。我需要能夠在保持每個表的主鍵的同時,從一個表向另一個表進行單向同步。如何同步兩個具有不同結構的MySQL表?

在這個例子中,我有兩個表(A)和(B)。我需要根據公共外鍵(下面的match1和match2)將表B中的value1和value2(下面)同步到表A中。表A將具有比表B更多的字段,並且B中有一些字段不會被同步。

我怎樣才能做到以下幾點:

  1. 插入到已被添加到B
  2. 從一個已經的B移除了改變
  3. 更新記錄中刪除值從乙

這裏領域是一些演示數據:

DROP TABLE IF EXISTS `a`; 
CREATE TABLE IF NOT EXISTS `a` (
    `id1` int(10) unsigned NOT NULL, 
    `match1` int(10) unsigned NOT NULL, 
    `value1` varchar(255) NOT NULL, 
    PRIMARY KEY (`id1`) 
); 

INSERT INTO `a` (`id1`, `match1`, `value1`) VALUES 
(1, 1, 'A'), 
(2, 2, 'A'), 
(3, 3, 'B'), 
(4, 4, 'C'), 
(5, 5, 'C'); 

DROP TABLE IF EXISTS `b`; 
CREATE TABLE IF NOT EXISTS `b` (
    `id2` int(10) unsigned NOT NULL, 
    `match2` int(10) unsigned NOT NULL, 
    `value2` varchar(255) NOT NULL, 
    PRIMARY KEY (`id2`) 
); 

INSERT INTO `b` (`id2`, `match2`, `value2`) VALUES 
(1, 1, 'A'), 
(2, 2, 'A'), 
(3, 3, 'B'), 
(4, 5, 'D'), 
(5, 6, 'D'), 
(6, 7, 'F'); 

我現在要做的方向是在兩個表之間創建一個合併表,並相應地構建查詢。例如:

create table ab as (select * from a, b); 

你有什麼建議?

+0

你是什麼意思「使數據看起來像B」?你想讓A包含與B相同的數據,只需添加其他字段? – MBillock 2009-09-30 17:50:40

+0

我同意MBillock。請澄清。 – exhuma 2009-09-30 17:52:50

+0

我編輯,以澄清我想要完成的。主要問題是維護合併中的主鍵。 – Dooltaz 2009-09-30 18:13:52

回答

4

1.Insert到已被添加到來自已經從乙

DELETE FROM a 
WHERE match1 IN (SELECT match1 FROM a INNER JOIN B ON A.match1 = B.match2) 

3.Update甲除去與改變的字段甲一切B

INSERT INTO a(id1, match1, value1) 
SELECT id2, match2, value2 
FROM b WHERE NOT EXISTS (SELECT 1 FROM a WHERE a.match1 = b.match2) 

2.取出甲一切的B

UPDATE a 
SET value1 = (SELECT value2 FROM b WHERE a.match1 = b.match2) 
+0

我正在檢查你的最佳答案,因爲你讓我開始了。謝謝。在上面的查詢中有幾個「錯字」,我決定爲WHILE循環執行一個存儲過程。你在那裏刪除會給出一個錯誤。你顯然在刪除語句的子選擇中不能有'a'。謝謝! – Dooltaz 2009-09-30 22:52:34

0
TRUNCATE TABLE A; 

INSERT INTO A (id1, match1, value1) 
    SELECT id2, match2, value2 FROM B; 
3

我BUIL存儲過程將所有內容正確合併。感謝您的迴應。這是我將要與之合作的。

BEGIN 

DECLARE loop_done INT; 
DECLARE orphan varchar(255); 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET loop_done=1; 

INSERT INTO a(id1, match1, value1) 
SELECT '', match2, value2 
FROM b WHERE NOT EXISTS (SELECT 1 FROM a WHERE a.match1 = b.match2); 

UPDATE a SET value1 = (SELECT value2 FROM b WHERE a.match1 = b.match2); 

/* This Delete statement works better for MySQL. */ 
SET loop_done=0; 
SET orphan=null; 
SELECT id1 INTO orphan FROM a left join b on (b.match2 = a.match1) where b.id2 is null LIMIT 1; 
WHILE (loop_done=0) DO 
DELETE FROM a WHERE id1=orphan; 
SELECT id1 INTO orphan FROM a left join b on (b.match2 = a.match1) where b.id2 is null LIMIT 1; 
END WHILE; 

END 
相關問題