有没有一种方法,我可以导入一个数据库,其中有一个数据,并将其导出到一个相同的数据库,但在其字段上的数据类型不同。像在数据库A与用户表有int与数据类型int,我想导出数据库A和导入到数据库B的用户表,但postal_code是varchar。所以我想要的是从一个数据库中获取数据发送到其他数据库,有类似的表和字段。只是一些不同的数据类型。这可能吗?
int
postal_code
varchar
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的原因,这样当您错误地恢复到原始模式时,它就不会意外地删除原始表。
--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中移动文件。它不需要 * 复制 * 整个表,只需更改它们的名称,因此无论表有多大,都不会花费更长的时间。另外,通过在一条语句中执行两个重命名,它们被原子地交换,因此来自其他客户端的对原始表的任何查询都不会看到表丢失的任何时刻。
mv
**专业提示:*我从来没有使用MySQL MySQL的数据导出/导入任务。我知道它有一个菜单项来做这件事,但它的bug和缓慢。我不知道为什么他们甚至费心在GUI工具中有这个功能。甚至有bug报告说它可能 * 无法导入所有数据!
在决定使用MySQL MySQL来执行此任务之前,您应该阅读以下错误报告:
我将只使用MySQL命令行工具进行数据导出/导入。
1条答案
按热度按时间w7t8yxp51#
并不一定要导出和导入数据来进行此更改。
您甚至可以使用ALTER TABLE来更改列的数据类型,而无需导出和导入。如果您更改了数据类型,并且所有值都可以轻松地转换为新数据类型中的值,那么它们只需转换即可。
但是,您可能希望将导出和导入作为单独的步骤,只是为了额外确保您不会破坏原始数据。
要使用完全导出和导入,我会这样做:
仅获取表,不获取数据:
字符串
仅获取数据,不使用表索引,并将其保存在单独的文件中:
型
将表恢复到测试模式(或原始模式以外的任何其他模式)。注意不要对原始模式运行此操作;这就是我使用
--skip-add-drop-table
的原因,这样当您错误地恢复到原始模式时,它就不会意外地删除原始表。型
更改数据类型:
型
仔细检查它是否看起来像你想要的:
型
恢复数据:
型
数据转储中的数值与VARCHAR列兼容,因此它们应该只是导入并存储为字符串数据而不是整数。
仔细检查数据是否符合您的要求:
型
现在您可以将新表替换为原始表:
型
这可以瞬间完成。重命名表类似于
mv
在shell中移动文件。它不需要 * 复制 * 整个表,只需更改它们的名称,因此无论表有多大,都不会花费更长的时间。另外,通过在一条语句中执行两个重命名,它们被原子地交换,因此来自其他客户端的对原始表的任何查询都不会看到表丢失的任何时刻。
**专业提示:*我从来没有使用MySQL MySQL的数据导出/导入任务。我知道它有一个菜单项来做这件事,但它的bug和缓慢。我不知道为什么他们甚至费心在GUI工具中有这个功能。甚至有bug报告说它可能 * 无法导入所有数据!
在决定使用MySQL MySQL来执行此任务之前,您应该阅读以下错误报告:
我将只使用MySQL命令行工具进行数据导出/导入。