我们使用MySQL表,随着产品的发展,我们会不时添加新字段。 我正在寻找一种方法将表的结构从db的一个副本导出到另一个,而不删除我要导入的表的内容。
例如说我有一个表的副本A和B,我将字段X,Y,Z添加到表A.是否有办法将更改的结构(字段X,Y,Z)复制到表B保持其内容完好无损?
我尝试使用mysqldump,但似乎我只能复制整个表及其内容,覆盖旧内容,或者我可以使用“-d”标志来避免复制数据(仅限转储结构),但是这样将在导入时创建一个空表,再次覆盖旧数据。
有没有办法用mysqldump或其他工具做我需要的东西?
答案 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
刚删除后:
localTable
(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
我们可以通过添加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)
惰性方式:导出旧数据和结构,导入实际结构,仅导入旧数据。在测试中对我有用。