2015-11-20 3 views
4

В моей базе данных у меня есть таблица по умолчанию (с именем «mytable»), которую я загружаю из Интернета. В таблице указано 100 строк и 10 столбцов (поля).MySQL - сравните две таблицы и сгенерируйте файл SQL diff

Я меняю некоторые значения в таблице, но я не удаляю и не вставляю ни строки, ни столбцы.

Скажите, что в пятом ряду таблицы я изменяю значение поля «Имя» от «Фокс» до «Медведя».

Затем я снова загружаю таблицу из Интернета, и я добавляю ее в базу данных с другим именем.

Итак, теперь у меня есть таблицы «oldtable» (содержащие значения по умолчанию) и «mytable», где изменяется только поле в одной строке.

Теперь я хочу показать другим, что я изменил в базе данных, и дать им сценарий SQL, который они могут запускать, чтобы они применяли те же изменения. Я не могу дать им свой «мой стол», потому что они не могут его использовать. У них также есть это, и они изменили некоторые ценности в нем, как они считают нужным. Они не хотят мой стол, они просто хотят применить изменения, которые я сделал, помимо изменений, которые они уже сделали в таблице.

Так что я могу дать им этот файл с именем «patch.sql»:

connect myDatabase; 
update mytable set name="Bear" where name like "Fox"; 

Однако, я хотел бы автоматически создать такой файл «patch.sql», так что я не должен помнить что я изменил и написал сценарий вручную. Программа может проверять различия между двумя таблицами и автоматически генерировать этот файл SQL.

Возможно ли это сделать в консоли MySQL или с любым другим существующим инструментом?

Обновление: таблица имеет первичный ключ.

+1

ли столбцы вы изменили фиксированные? Я имею в виду, что вы всегда меняете значения в одном столбце? –

+0

Нет, изменения могут быть в любом столбце.Но мне также было бы интересно узнать решение для конкретного случая, когда я меняю только один столбец – frostwolf

+0

Не могли бы вы просто использовать diff или что-то вроде Meld в файлах SQL? – ggdx

ответ

1

Если вы редактируете с коллегами разные строки, скрипт может быть легким.

Но если Вы думаете, что Вы можете редактировать одни и те же строки, но разные столбцы, то выглядеть следующим:

У вас есть 2 таблицы

table_1:

id, col1, col2, col3 
1 10 50 1 
2 10 60 9 
3 12 50 3 
4 12 60 4 
5 11 70 5 

table_2:

id, col1, col2, col3 
1 20 50 1 
2 30 60 2 
3 12 60 3 
4 12 60 5 
5 15 77 22 

и запустить этот скрипт:

SELECT CONCAT('UPDATE table_1 SET ' 
       , CASE WHEN t1.col1 != t2.col1 THEN CONCAT(' col1 = ', t2.col1) ELSE '' END 
       , CASE WHEN t1.col1 != t2.col1 AND t1.col2 != t2.col2 THEN ', ' ELSE ''END 
       , CASE WHEN t1.col2 != t2.col2 THEN CONCAT(' col2 = ', t2.col2) ELSE '' END 
       , CASE WHEN t1.col3 != t2.col3 AND (t1.col2 != t2.col2 OR t1.col1 != t2.col1) THEN ', ' ELSE ''END 
       , CASE WHEN t1.col3 != t2.col3 THEN CONCAT(' col3 = ', t2.col3) ELSE '' END 
       , CONCAT(' WHERE id = ', t1.id)) as update_txt 
FROM table_1 t1 JOIN table_2 t2 ON t1.id = t2.id WHERE t1.col1 != t2.col1 OR t1.col2 != t2.col2 OR t1.col3 != t2.col3 

Ваш результат будет:

UPDATE table_1 SET col1 = 20 WHERE id = 1 
UPDATE table_1 SET col1 = 30, col3 = 2 WHERE id = 2 
UPDATE table_1 SET col2 = 60 WHERE id = 3 
UPDATE table_1 SET col3 = 5 WHERE id = 4 
UPDATE table_1 SET col1 = 15, col2 = 77, col3 = 22 WHERE id = 5 

Тогда Вам нужно просто скопировать результат колонки в текстовый файл и отправить на другие части.

Это работа для UPDATE, если Вы планируете вставки/удаления строк, сценарий будет более сложным, но и использовать ту же логику

+0

Большое спасибо, не планируя вставлять или удалять строки. Есть ли также готовые (Windows) программы для этого? – frostwolf

+0

много, я не знаю всех, но это один из примеров - http://sqlyogkb.webyog.com/article/300-visual-data-compare, у него есть предварительный просмотр SQL - это скрипт, который вы хотите. но как я помню (не уверен) - это для синхронизации на основе строк. Не уверен, как он готовит скрипт - измененным столбцом или целым рядом –

Смежные вопросы