我的公司目前正在移动我们的数据库,将一组表从旧的 MySQL 实例转移到新的实例中。在这次迁移之前,我们已经做了一些开发,并且一些表的结构已经从原来的改变了(例如,列被删除了)。
所以目前我已经从旧数据库中转储了数据,现在正试图将它们重新插入到新表中。当然,当它尝试插入具有比表更多字段的行时,导入会失败。
仅将我需要的字段导入新表的最佳方法是什么(最好是可编写脚本的,因为我预见自己必须再执行几次)?
首先,创建具有旧结构的新数据库,或在当前数据库中创建临时表。然后为每一行运行带有插入语句的脚本,但值必须是新结构中的那些字段。
insert into newTable select row1,row2 from tempTable
更新以下内容以适应:
SELECT 'INSERT INTO NEW_TABLE ... ('+ to.column +');'
FROM OLD_TABLE ot
对于新数据库上的表,您需要一个 INSERT 语句,其中包含列列表。然后根据旧表中的值相应地填充值部分。在旧环境中运行,您将插入新环境的数据 - 只需将“n”粘贴到脚本中。
请注意,必须相应地处理数据类型 - 日期(包括时间),并且必须处理字符串,因为您正在处理文本。
使用最快的方式,在文件中加载数据:
-- 转储数据
SELECT * INTO OUTFILE 'mybigtable.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n'
FROM mybigtable
-- 加载数据
LOAD DATA LOCAL INFILE 'mybigtable.csv'
INTO TABLE mynewbigtable
FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'
(@col1,@col2,@col3,@col4) set name=@col4,id=@col2;
参考:
如果您使用的是强大的 MySQL 5.1,虽然在这种情况下可能有点矫枉过正,但解决方案是执行 xml mysqldump 并使用 XSLT 对其进行转换。不幸的是,5.0 不支持重新导入该 xml 文件,您需要 5.1、5.4 或 6.0