2009-09-30 6 views
4

Я перехожу от одной системы к другой, и в процессе я буду одновременно запускать обе системы. Мне нужно иметь возможность синхронизировать однонаправленно из одной таблицы в другую, сохраняя основные ключи каждой таблицы.Как синхронизировать две таблицы MySQL, которые имеют разные структуры?

В этом примере у меня есть две таблицы (A) и (B). Мне нужно синхронизировать value1 и value2 (ниже) из таблицы B в таблицу A на основе общего внешнего ключа (match1 и match2 ниже). Таблица A будет иметь дополнительные поля, чем таблица B, и в B есть несколько полей, которые не будут синхронизированы.

Как я могу сделать следующее:

  1. вставки в значения, которые были добавлены к B
  2. Удалить из A записи, которые были удалены из B
  3. Update А с изменившейся поля от B

Вот некоторые демо-данные:

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

Что вы подразумеваете под «Сделать данные в A похожими на B»? Вы хотите, чтобы A содержал те же данные, что и B, только с дополнительными полями? – MBillock

+0

Я согласен с MBillock. Просьба уточнить. – exhuma

+0

Я отредактировал, чтобы уточнить, что я пытаюсь выполнить. Основная проблема заключается в том, чтобы сохранить первичные ключи в слиянии. – Dooltaz

ответ

4

1.Insert в А все, что было добавлено к В

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.Remove от А все, что было удалено из В

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

3.Update А с измененными полями от B

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

Я проверяю ваш, как лучший ответ, потому что вы меня начали. Спасибо. В запросах выше несколько «опечаток», и я решил сделать цикл WHILE хранимой процедуры для удаления. Удаление, которое у вас есть, дает ошибку. Вы, по-видимому, не можете иметь «a» в подвыборке инструкции delete. Благодаря! – Dooltaz

0
TRUNCATE TABLE A; 

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

I стро t хранимую процедуру для правильного слияния. Спасибо за ответы. Это то, с чем я буду идти.

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 
Смежные вопросы