Я создаю скрипт PHP для сравнения схемы двух баз данных.
Мне удалось проверить изменения схемы в отношении удаленных / добавленных таблиц, столбцов, индексов, ссылок, но когда дело доходит до переименованных столбцов, я немного застрял.
В следующем примере исходная база данных содержит наиболее актуальную схему, а база назначения содержит аналогичную схему, но, вероятно, устарела.
Требования:
- Мне не известно об изменениях, которые произошли со времени последнего различий.
- Данные в базах данных не будут совпадать, но схема должна после различий.
Возьмем, к примеру, следующую схему в целевой базе данных.
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, что исключает регистрацию этих изменений. Я читал этот рабочий журнал ( WL # 2418: триггеры DDL ) в MySQL Forge (сейчас он находится в MySQL Developer Zone), но, к сожалению, его реализация еще не завершена.
Есть ли способ обновления таблиц в соответствии со схемой в отношении переименованных столбцов без потери данных?
Я смотрел на такие вещи, как MySQLDiff , но он должен быть встроен в существующий фрагмент кода, поэтому мне приходится создавать его самостоятельно.
Идеи, которые я рассмотрел
Добавьте комментарий к каждому столбцу, который является уникальным числом или строкой (для аргумента назовите его хешем). Запросите таблицу information_schema, чтобы получить это значение и сравнить его в каждом столбце. Если он уникален, то это новый столбец, или если он соответствует хешу, но не имени или структуре, он переименовывается / реконфигурируется.
Сравните схему, если есть новый столбец - проверьте его положение относительно соседних столбцов. Если имя нового столбца находится в той же позиции, что и отсутствующий, сравните структуру этого столбца. Если оно совпадает, считайте его переименованным. Если нет, считайте его удаленным, а затем добавленным.