有没有一种方法可以导入其中包含数据的数据库,并将其导出到相同的数据库中,但其字段上的数据类型不同.例如,在数据库A中,用户表有postal_code
,数据类型为int
,我想导出数据库A,然后导入到数据库B,用户表,但postal_code
是varchar
.
所以我想要的就是从一个数据库中获取数据,然后将其发送到具有类似表和字段的其他数据库.只是一些不同的数据类型.
这有可能吗?
有没有一种方法可以导入其中包含数据的数据库,并将其导出到相同的数据库中,但其字段上的数据类型不同.例如,在数据库A中,用户表有postal_code
,数据类型为int
,我想导出数据库A,然后导入到数据库B,用户表,但postal_code
是varchar
.
所以我想要的就是从一个数据库中获取数据,然后将其发送到具有类似表和字段的其他数据库.只是一些不同的数据类型.
这有可能吗?
进行此更改并不一定要导出和导入数据.
您甚至可以更改TABLE以原地更改列的数据类型,而无需导出和导入.如果您更改了数据类型,并且所有值都可以很容易地转换为新数据类型中的值,则它们只需转换即可.
但您可能希望将导出和导入作为单独的步骤,以确保不会损坏原始数据.
要在完全导出和导入的情况下做到这一点,我会这样做:
只获取表格,不获取数据:
mysqldump --no-data --skip-add-drop-table myschema mytable > ddl.sql
只获取数据,不包括表DDL,并将其保存在单独的文件中:
mysqldump --no-create-info myschema mytable > data.sql
将表恢复到测试模式(或除原始模式以外的任何其他模式).请注意不要对您的原始模式运行此命令;这就是我使用--skip-add-drop-table
的原因,这样如果您错误地恢复到原始模式,它就不会意外地删除您的原始表.
mysql test < ddl.sql
更改数据类型:
mysql test -e "ALTER TABLE mytable MODIFY COLUMN mycolumn VARCHAR(32)"
仔细判断它是否看起来像您想要的:
mysql test -e "SHOW CREATE TABLE mytable"
恢复数据:
mysql test < data.sql
这应该行得通.数据转储中的数值与VARCHAR列兼容,因此它们应该只作为字符串数据导入和存储,而不是整数.
仔细判断数据是否符合您的要求:
mysql test -e "SELECT * FROM mytable LIMIT 10"
现在,您可以将新表替换为原来的表:
mysql -e "RENAME TABLE myschema.mytable TO test.original_mytable,
test.mytable TO myschema.mytable"
这可以在瞬间完成.重命名表类似于mv
来移动shell 中的文件.它不需要copy整个表,只需要更改它们的名称,所以无论表有多大,它都不会花费更长的时间.
此外,通过在一条语句中进行两个重命名,它们将自动交换,因此来自其他客户端的对原始表的任何查询都不会看到表丢失的任何时刻.
Pro Tip:我从不使用MySQL工作台执行数据导出/导入任务.我知道它有一个菜单项可以做到这一点,但它的错误和速度太慢了.我不知道他们为什么要费心在图形用户界面工具中拥有这个功能.甚至有虫子报告说它可以fail to import all data!
在决定使用MySQL工作台执行此任务之前,您应该阅读如下错误报告:
我将只使用MySQL命令行工具进行数据导出/导入.