Синхронизация структур таблиц

Вурдалак

Продвинутый новичок
korchasa, спасибо, но лень :) Сейчас пока EMS DB Comparer и dbForge щупаю. Первый щупать осталось месяцок.

-~{}~ 04.10.10 23:34:

dbForge иногда, по-моему, помечает как изменённые те столбцы, которые я и не трогал...
 

vovanium

Новичок
Провел небольшой тест сравнилок

старая структура
[SQL]CREATE TABLE `test2` (
`a` SMALLINT(10) NULL DEFAULT NULL,
`b` INT(10) NULL DEFAULT NULL COMMENT 'to rename',
`c` TIMESTAMP NULL DEFAULT NULL
) ENGINE=MyISAM[/sql]

новая
[SQL]CREATE TABLE `test2` (
`a` SMALLINT(10) UNSIGNED NOT NULL DEFAULT '0',
`a2` SMALLINT(10) UNSIGNED NOT NULL DEFAULT '0' COMMENT 'new row',
`b2` INT(10) NULL DEFAULT NULL COMMENT 'to rename',
`c` DATETIME NULL DEFAULT NULL,
PRIMARY KEY (`a`)
) COMMENT='Testing' ENGINE=InnoDB[/SQL]

EMS DB Comparer - кривоват, тупит с добавлением полей (не указывает после какого поля добавить новое), по умолчанию не проверяет комменты таблиц.

dbForge Studio и Navicat - справились значительно лучше, хотя dbForge почему-то всегда юзает CHANGE COLUMN, вместо MODIFY, а Navicat для всех изменений колонок добавляет AFTER, но это мелочи.

Ну и основной вывод ни одна из софтин не понимает переименование столбцов, даже если во всей структуре исменилось только название одного столбца, а всё остальное идентично. В таком случае все софтины удаляют старый столбец, и добавляют новый, со всеми вытекающими потерями данных. Естественно переименование столбцов не частая операция, но все же следует иметь ввиду.
 

zerkms

TDD infected
Команда форума
Ну и основной вывод ни одна из софтин не понимает переименование столбцов, даже если во всей структуре исменилось только название одного столбца, а всё остальное идентично.
естественно. вот если бы тебе дали 2 схемы, в которых отличается только 1 столбец, то ты бы сам смог сказать, какая именно модификация произошла?

ps: dbforge понимает переименование - по нажатию ctrl+s он должен генерить ALTER на переименование (сейчас проверить не могу, но уверен на 99%)
 

vovanium

Новичок
zerkms
имхо, логика довольно простая, если изменилось только название, то следовательно произошло переименование ;)
и совсем не нужно удалять старый столбец, и добавлять абсолютно такой же новый, только с другим именем.

что касается ctrl+s, то это как бы из другой оперы, понятное дело, что если все изменения с базой делаются исключительно в одной софтине, то легко можно сохранять сделанные с её помощью изменения.
 

zerkms

TDD infected
Команда форума
vovanium
[sql]
CREATE TABLE `test2` (
`a` SMALLINT( 10 ) NULL DEFAULT NULL ,
`b` INT( 10 ) NULL DEFAULT NULL COMMENT 'to rename',
`c` TIMESTAMP NULL DEFAULT NULL
)ENGINE = MYISAM;
[/sql]
[sql]
CREATE TABLE `test2` (
`a` SMALLINT( 10 ) NULL DEFAULT NULL ,
`b` INT( 10 ) NULL DEFAULT NULL COMMENT 'to rename',
`brand_new_column` TIMESTAMP NULL DEFAULT NULL
)ENGINE = MYISAM
[/sql]

Нука скажи, переименовали мы тут столбец или удалили и создали новый?
Hint: имя столбца как бы намекает :)

что касается ctrl+s, то это как бы из другой оперы, понятное дело, что если все изменения с базой делаются исключительно в одной софтине, то легко можно сохранять сделанные с её помощью изменения.
ну так и зачем усложнять себе жизнь тогда? :) лично я с mysql работаю только через dbForge. это позволяет мне никогда не париться теми проблемами, что тут сейчас обсуждаются. но это, безусловно, дело каждого - как работать :)
 

vovanium

Новичок
zerkms
имя столбца как бы намекает
можно конечно поспорить, что именно переименовали, так как врятли ты для получения данной структуры использовал DROP COLUMN :)
С таким же успехом можно оставить старое название столбца и сказать, что между этими двумя структурами было сделано удаление и создание столбца. Да и зачем такое делать? Для обнуления столбца? И часто ты делаешь это ALTER'ом, вместо UPDATE?
 

zerkms

TDD infected
Команда форума
vovanium
вот именно, что. программирование превращается в гадание.
для того, чтобы не гадать - надо использовать один инструмент :)

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

зачем это делать? если мне не нужен один столбец, а нужен другой, с другими данными - тогда да, лично мне проще удалить и создать. чем переименовывать и делать UPDATE.
 

vovanium

Новичок
zerkms
потому как правильный вариант ты можешь банально не угадать и испортить данные.
Ну как бы проблема в том, что в моем варианте, данные не портятся, плюс само изменение проиходит мгновенно (так как не начинается создание временных копий таблиц и т.п.).
лично мне проще удалить и создать. чем переименовывать и делать UPDATE
ну да, написать UPDATE test2 SET c = null это очень долго, да и делать drop/add column на большой таблице с данными веселое занятие для сервака :)

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

zerkms

TDD infected
Команда форума
Ну как бы проблема в том, что в моем варианте, данные не портятся, плюс само изменение проиходит мгновенно (так как не начинается создание временных копий таблиц и т.п.).
портятся. в зависимости от удачи ты выберешь правильный или неправильный вариант. и как результат: получишь или ожидаемые записи или пачку мусора.

ну да, написать UPDATE test2 SET c = null это очень долго
в гуях мне проще именно так, как я написал :) и не надо меня лечить про огромные таблицы, мы говорим о правильности операции, а не о производительности. :)
 

vovanium

Новичок
zerkms
и как результат: получишь или ожидаемые записи или пачку мусора.
Вообще-то как результат ты получишь SQL-скрипт, так сказать для освежения памяти, так что врятли будет неожиданный результат.

в гуях мне проще именно так, как я написал
ну на вкус и цвет... мне проще в gui выпонить update (берешь одно поле обнуляешь, потом копируешь запрос из SQL-монитора и чистишь весь столбец), чем запоминать свойства поля и потом заново их вводить в форме создания поля.
а патчи для продакшена тоже будешь с add/drop делать? :)
 

zerkms

TDD infected
Команда форума
Для продакшна я буду всё нормально писать :)
 

vovanium

Новичок
zerkms
В общем набросал пока свой скриптик, который по вышеприведенным данным строит такой diff
Код:
ALTER TABLE `test2`
	MODIFY COLUMN `a` smallint(10) unsigned NOT NULL DEFAULT '0',
	ADD COLUMN `a2` smallint(10) unsigned NOT NULL DEFAULT '0' COMMENT 'new row' AFTER `a`,
	CHANGE COLUMN `b` `b2` int(10) NULL DEFAULT NULL COMMENT 'to rename',
	MODIFY COLUMN `c` datetime NULL DEFAULT NULL,
	ENGINE = INNODB,
	COMMENT = 'Testing',
	ADD PRIMARY KEY (a, c),
	ADD INDEX `Index 2` (b2);
Будем тестить.
P.S. тег SQL сильно коверкает запрос, хоть и раскрашивает его...
 

Вурдалак

Продвинутый новичок
Кто-нибудь в курсе как заставить dbForge не добавлять имя БД к имени таблицы в скрипте изменений?
 

zerkms

TDD infected
Команда форума
Вурдалак
Ага, меня это тоже бесит :) Решения не знаю, но особо поисками не занимался.
 
Сверху