有没有一种方法可以导入包含数据的数据库并将其导出到同一数据库但其字段上的数据类型不同。就像在数据库 A 中,用户表有
postal_code
,数据类型为 int
,我想导出数据库 A 并导入到数据库 B 用户表,但 postal_code
是 varchar
。
所以我想要的只是从数据库获取数据并将其发送到具有类似表和字段的其他数据库。只是一些不同的数据类型。
这可能吗?
我会这样做:
仅获取表格,不获取数据:
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"
这可以立即完成。重命名表类似于在 shell 中移动文件的
mv
。它不需要复制整个表,它只是更改它们的名称,因此无论表有多大,都不需要更长的时间。
此外,通过在一条语句中执行两个重命名,它们会自动交换,因此其他客户端对原始表的任何查询都不会看到该表丢失的任何时刻。
专业提示:我从不使用 MySQL Workbench 执行数据导出/导入任务。我知道它有一个菜单项可以做到这一点,但它有严重的错误和缓慢。我不知道他们为什么费心在 GUI 工具中添加这个功能。甚至有错误报告称它可能无法导入所有数据!
我只会使用 MySQL 命令行工具进行数据导出/导入。