Могу ли я импортировать обновленную структуру в таблицу MySQL без потери ее текущего содержимого?

Мы используем таблицы MySQL, к которым мы добавляем новые поля время от времени по мере развития нашего продукта. Я ищу способ экспортировать структуру таблицы из одной копии db, в другую, не удаляя содержимое таблицы, в которую я импортирую.

Например, у меня есть копии A и B таблицы, и я добавляю поля X, Y, Z в таблицу A. Есть ли способ скопировать измененную структуру (поля X, Y, Z) в таблицу B в то время как сохранить его содержание в целости?

Я попытался использовать mysqldump, но мне кажется, что я могу скопировать всю таблицу с ее содержимым, переопределив старый, или я могу использовать флаг "-d", чтобы избежать копирования данных (только для структуры демпинга), но это создаст пустую таблицу при импорте, снова переопределив старые данные.

Есть ли способ сделать то, что мне нужно, с mysqldump или другим инструментом?

Ответ 1

То, что я обычно делаю, это хранить каждый оператор ALTER TABLE, выполняемый в таблицах (-ях) разработки, и применять их к целевой таблице (таблицам), когда это необходимо.

Есть более сложные способы сделать это (например, инструменты сравнения структуры и т.д.), но я нахожу, что эта практика работает хорошо. Выполнение этого на ручном шаге также помогает предотвратить случайное изменение или разрушение данных с помощью структурных изменений, которые изменяют тип поля или максимальную длину.

Ответ 2

для вашего случая, просто может потребоваться выполнить обновление

alter table B add column x varchar(255);
alter table B add column y varchar(255);
alter table B add column z varchar(255);

update A,B 
set 
  B.x=A.x,
  B.y=A.y,
  B.z=A.z
where A.id=B.id; <-- a key that exist on both tables

Ответ 3

Существует удобный способ сделать это, но нужно немного изменить в текстовом редакторе: Это касается Max 10Min в Gedit Under Linux!!


Экспортируйте таблицу и сохраните ее в: localTable.sql

Откройте его в текстовом редакторе (Gedit). Вы увидите что-то вроде этого:

CREATE TABLE IF NOT EXISTS `localTable` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `date` int(10) NOT NULL,
    # Lot more Fields .....
    #Other Fields Here

После простого удаления:

  • Что-нибудь после закрытия) parenthese
  • CREATE TABLE, если не EXISTS localTable (
  • Измените все , на ; в каждой строке, как это вы выполняете все это раз (,\n,;\n)
  • удалить все ADDPRIMARY KEY (id); ADDKEY created_by (created_by)!
  • И просто держите поля, которые вас интересуют.

У вас будет это

  `id` int(8) NOT NULL AUTO_INCREMENT,
  `date` int(10) NOT NULL,
    # Lot more Fields .....
    #Other Fields Here

Добавить в начало каждой строки ALTER TABLE localTable ADD

 ALTER TABLE `localTable` ADD `id` int(8) NOT NULL AUTO_INCREMENT,
 ALTER TABLE `localTable` ADD  `date` int(10) NOT NULL,
   ALTER TABLE `localTable` ADD #to each more Fields .....
    #Other Fields Here

Чтобы сделать это, мы можем сделать это ab Automated Script, добавив оболочку Script для выполнения этого задания.

После того, как вы знаете, что вам нужно сделать Импортируйте его в 'remoteTable';)

Спасибо

Ответ 4

У меня была такая же проблема, и я решил ее так:

Экспортировать структуру таблицы для обновления. Экспортируйте структуру таблицы разработки.

запустите этот код для первого файла. "update.sql" необходимо изменить в соответствии с вашим экспортированным именем файла.

cat update.sql|awk -F / '{
 if(match($0, "CREATE TABLE")) {
   { FS = "`" } ; table = $2
 } else {
   if(match($0,"  `")) {
     gsub(",",";",$0)
     print "ALTER TABLE `" table "` ADD" $0
    }
 }
}' > update_alter.sql

запустить ту же команду для второго файла

cat development.sql|awk -F / '{
 if(match($0, "CREATE TABLE")) {
   { FS = "`" } ; table = $2
 } else {
   if(match($0,"  `")) {
     gsub(",",";",$0)
     print "ALTER TABLE `" table "` ADD" $0
    }
 }
}' > development_alter.sql

запустите эту команду, чтобы найти различия в выходных файлах

diff --changed-group-format='%<' --unchanged-group-format='' development_alter.sql update_alter.sql > update_db.sql

В файле update_db.sql теперь будет код, который вы ищете.

Ответ 5

Нет, это невозможно, потому что MySql использует версию mariaDB. В mariaDB структура версии таблицы организована в памяти, а память - совместно с вашими байтовыми данными. Поэтому, когда мы пытаемся импортировать структуру (или таблицу), она меняет весь блок памяти.