导出一个数据库表,其中有一个数据,并导入到同一个表与不同的数据类型,在他们的字段与MySQL的MySQL

xmq68pz9  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(62)

有没有一种方法,我可以导入一个数据库,其中有一个数据,并将其导出到一个相同的数据库,但在其字段上的数据类型不同。像在数据库A与用户表有int与数据类型int,我想导出数据库A和导入到数据库B的用户表,但postal_codevarchar
所以我想要的是从一个数据库中获取数据发送到其他数据库,有类似的表和字段。只是一些不同的数据类型。
这可能吗?

w7t8yxp5

w7t8yxp51#

并不一定要导出和导入数据来进行此更改。
您甚至可以使用ALTER TABLE来更改列的数据类型,而无需导出和导入。如果您更改了数据类型,并且所有值都可以轻松地转换为新数据类型中的值,那么它们只需转换即可。
但是,您可能希望将导出和导入作为单独的步骤,只是为了额外确保您不会破坏原始数据。
要使用完全导出和导入,我会这样做:
仅获取表,不获取数据:

mysqldump --no-data --skip-add-drop-table myschema mytable > ddl.sql

字符串
仅获取数据,不使用表索引,并将其保存在单独的文件中:

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中移动文件。它不需要 * 复制 * 整个表,只需更改它们的名称,因此无论表有多大,都不会花费更长的时间。
另外,通过在一条语句中执行两个重命名,它们被原子地交换,因此来自其他客户端的对原始表的任何查询都不会看到表丢失的任何时刻。

**专业提示:*我从来没有使用MySQL MySQL的数据导出/导入任务。我知道它有一个菜单项来做这件事,但它的bug和缓慢。我不知道为什么他们甚至费心在GUI工具中有这个功能。甚至有bug报告说它可能 * 无法导入所有数据!

在决定使用MySQL MySQL来执行此任务之前,您应该阅读以下错误报告:

我将只使用MySQL命令行工具进行数据导出/导入。

相关问题