我可以将更新的结构导入MySQL表而不会丢失其当前内容吗?

时间:2011-01-02 20:40:56

标签: mysql mysqldump

我们使用MySQL表,随着产品的发展,我们会不时添加新字段。 我正在寻找一种方法将表的结构从db的一个副本导出到另一个,而不删除我要导入的表的内容。

例如说我有一个表的副本A和B,我将字段X,Y,Z添加到表A.是否有办法将更改的结构(字段X,Y,Z)复制到表B保持其内容完好无损?

我尝试使用mysqldump,但似乎我只能复制整个表及其内容,覆盖旧内容,或者我可以使用“-d”标志来避免复制数据(仅限转储结构),但是这样将在导入时创建一个空表,再次覆盖旧数据。

有没有办法用mysqldump或其他工具做我需要的东西?

6 个答案:

答案 0 :(得分:4)

我通常做的是存储在开发表上运行的每个ALTER TABLE语句,并在必要时将它们应用于目标表。

有更复杂的方法可以做到这一点(比如结构比较工具等),但我发现这种做法效果很好。在逐步手动的基础上执行此操作还有助于防止通过更改字段类型或最大长度的结构更改意外更改或破坏数据。

答案 1 :(得分:0)

对于您的情况,可能只需要执行更新

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

答案 2 :(得分:0)

有一种方便的方法,但需要在文本编辑器中进行一些编辑: 这在Linux下的Gedit中大约需要10Min!


导出你的桌子&amp;将其保存在: localTable.sql

在文字edior(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

刚删除后:

  • 结束后的任何事情)括号
  • CREATE TABLE IF NOT NOT EXISTS localTable
  • 将每个行中的所有更改为; ,就像执行所有这一行一样(,\ n到; \ n)
  • 删除所有ADDPRIMARY KEY(id); ADDKEY created_bycreated_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

我们可以通过添加Shell脚本来完成这项工作,从而制作这个自动脚本。

知道了你必须做的事情在'remoteTable'中导入它;)

谢谢

答案 3 :(得分:0)

我遇到了同样的问题并以这种方式解决了这个问题:

导出表的结构以进行更新。 导出开发表的结构。

为第一个文件运行此代码“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中,现在将出现您正在寻找的代码。

答案 4 :(得分:0)

不可能,因为MySql使用的是mariaDB版本。在mariaDB中,表的版本结构排列在内存中,并且该内存与您的字节数据共享。 因此,当我们尝试导入结构(或表)时,它会改变整个内存块。

答案 5 :(得分:0)

惰性方式:导出旧数据和结构,导入实际结构,仅导入旧数据。在测试中对我有用。