Я создаю PHP script для сравнения схемы двух баз данных.
Мне удалось проверить изменения схемы в отношении упавших/добавленных таблиц, столбцов, индексов, ссылок, но когда дело доходит до переименованных столбцов, я немного застрял.
В следующем примере исходная база данных содержит самую современную схему, а база данных назначения содержит аналогичную схему, но, вероятно, устарела.
Предпосылки:
- Мне не известны изменения, произошедшие со времени последнего разлома.
- Данные в базах данных не будут совпадать, но схема должна после diff.
Возьмем, к примеру, следующую схему в базе данных назначения.
Field Type Null Key Default Extra
field1 int(11) NO NULL
field2 int(11) NO NULL
field3 int(11) NO NULL
И затем предположим следующую схему в исходной базе данных.
Field Type Null Key Default Extra
field1 int(11) NO NULL
field4 int(11) NO NULL
field3 int(11) NO NULL
Не зная, что произошло, я не могу определить, изменился ли field2
на field4
с помощью DROP, ADD AFTER
или CHANGE COLUMN
. Следующие два запроса достигают одного и того же результата с точки зрения структуры таблицы, но данные теряются с использованием первого.
(1) ALTER TABLE `demo` DROP `field2`
ALTER TABLE `demo` ADD `field4` INT( 11 ) NOT NULL AFTER `field1`
(2) ALTER TABLE `demo` CHANGE `field2` `field4` INT( 11 ) NOT NULL
Я могу, очевидно, отказаться от старого имени столбца и создать новый, но затем терять любые данные в исходном столбце. Мне нужно использовать запрос ALTER TABLE table CHANGE COLUMN field new_name structure;
, а не DROP column FROM table
, за которым следует ALTER TABLE table
ADD column definition;
Я надеялся, что могу использовать триггер DDL для отслеживания изменений в схеме и вставить запись таких изменений в таблицу в исходной базе данных. Я мог бы позже запросить эту таблицу, чтобы определить, как появился определенный столбец. Однако, насколько я могу судить, невозможно запускать триггеры в DDL-запросах в MySQL, что исключает регистрацию этих изменений. Я прочитал этот worklog (WL # 2418: Триггеры DDL) в MySQL Forge (теперь он находится в зоне разработки MySQL), но, похоже, это ожидаемая реализация все еще, к сожалению.
Есть ли способ, с помощью которого можно обновлять таблицы в соответствии с схемой в отношении переименованных столбцов без потери данных?
Я просмотрел такие вещи, как MySQLDiff, но он должен быть встроен в существующий бит кода, поэтому мне нужно построить это сам.
Идеи, которые я рассмотрел
-
Добавьте комментарий к каждому столбцу, который является уникальным номером или строкой (назовите это хэш для аргумента). Запросите таблицу information_schema для получения этого значения и сравните его с каждым столбцом. Если он уникален, то это новый столбец, или если он соответствует хешу, но не имя или структура, то он был переименован/реконфигурирован.
-
Сравните схему, если есть новый столбец, проверьте ее положение относительно соседних столбцов. Если имя нового столбца находится в том же месте, что и отсутствует, сравните структуру этого столбца. Если он соответствует, рассмотрите его переименован. Если нет, рассмотрите его, а затем добавьте.