有没有一种方法可以导入其中包含数据的数据库,并将其导出到相同的数据库中,但其字段上的数据类型不同.例如,在数据库A中,用户表有postal_code,数据类型为int,我想导出数据库A,然后导入到数据库B,用户表,但postal_codevarchar.

所以我想要的就是从一个数据库中获取数据,然后将其发送到具有类似表和字段的其他数据库.只是一些不同的数据类型.

这有可能吗?

推荐答案

进行此更改并不一定要导出和导入数据.

您甚至可以更改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命令行工具进行数据导出/导入.

Mysql相关问答推荐

MySQL添加表会将&@@&qot;追加到表名

对多个数据库运行UPDATE mySQL查询

使用复合主键更新后的MySQL触发器失败

为什么用PyMySQL构建的json返回结果会出现重复?

"Shelf服务器容器访问MySQL Docker容器时出现SocketException异常"

使用mysql查询获取不关注user1的user3

根据名称将值从一个字段复制到不同记录的同一字段

列出每年最多产的三位作家

MySQL如何在小时和分钟之间 Select 时间

在 SQL 中的 case 语句之后将新列转换为 INT

如何在考虑另一表的值的情况下计算一列的值

mysql 5.5;可以从记录中排除表吗?

授予用户对 MySQL 中有限数量表的访问权限

如何在 MySQL 上一次删除一系列记录?

MySQL如何为数据库中的所有表生成DDL

MySQL - 表'my_table'没有被锁定表锁定

为什么 MySQL 自动增量会在插入失败时增加?

将 UTF8 表上的 latin1 字符转换为 UTF8

我在哪里可以下载 mysql jdbc jar?

MySQL中的base64编码