从Access数据库导数据到MySQL

2023/7/1更新: 对于View, 没找到好办法...只能手工处理,补充进来

------------------------------------------------------------------------------------------

以前开发过一个小工具,用的是Acesss数据库,现在需要把它迁移到云上MySQL数据库。

看起来一挺简单的事儿,也费了点周折,记录下来备忘。

用DBeaver吧

折腾了不少方法,还差点用一个付费工具,最终都放弃了。最终决定还是手工创建。

因为我一直用DBeaver做为数据管理器,突然灵光一现,搜了一下DBeaver中从Acess迁到MySQL,结果发现真有办法。参考以下文章:

(215条消息) 使用Dbeaver将access中表导入到mysql中_weixin_35695688的博客-CSDN博客

虽然不是非常完美,需要一个表一个表来,但是已经省了很多事了 (字段较多 )

嗯,没那么美好...

实际运行时发现有些问题,逐一解决了:

  • 字段两侧的括号问题

从Access数据库中生成的SQL, 字段两侧会加上方括号

在MySQL中执行时,会报错

 解决方法倒是很简单, 粘贴过去以后,用replace all功能把左右括号全替换成空就行了。

这也是一个很好的例子,说明定义字段名时,不要有空格,要简短是多么地重要!

  • 字段类型问题

Access数据库中,Number类型 在生成的SQL中是NUMERIC(100,7),远远超出了MySQL的65位。实际上当然不可能有这么大的数字, 就我这个应用,存放的是税金,9位就是1亿,NUMERIC(10,4)就是可以容纳99亿,足够了。所以如果遇到提示,要根据实际情况改一下。

还有就是ACCESS里的Date/Time在生成的SQL里是TIMESTAMP, 除非真的是需要时间戳,否则要根据实际改一下。不然都精确到毫秒,将来查询时可能会出问题。

  • 索引及主键定义问题(SQL执行次序问题)

如果原始表中设置了主键和索引,那么会生成对应的SQL。粘贴到MySQL中去执行的时候,要先执行创建表的部分,然后逐一执行主键和索引的对应语句,不能一次性全部执行,否则就会报错。

  • View迁移

很多业务逻辑是在Access里通过view实现的, 发现DBeaver不能正确识别Access view中的SQL

 

 没找到更好的办法,最终只能从ACCESS里copy SQL,用CREAT VIEW语句到DBeaver里创建。

 倒也不费太多事。

就是ACCESS的SQL和MySQL有些区别, 比如ACCESS里是IIF()函数,MySQL里是IF()函数; ACCESS SQL里临时定义的字段名,允许在后面立即使用,MySQL不行。例如下面这段SQL中定义了Payment字段和Invoice字段,然后立即引用它们,在 ACCESS里是可行的,在MySQL中只能老老实实把原始字段名写一遍: 

SELECT T3_ComYM_FullList.COMPANY, T3_ComYM_FullList.YM, T1_PaymentByYM.AmountOfSum AS Payment, T2_InvoiceByYM.TaxAmtOfSum AS Invoice, IIF(ISNULL([Payment]),0,[Payment]) - IIF(ISNULL([Invoice]),0,[Invoice]) AS Gap

其它比如字段名两边不能有方括号跟之前是一样的。

技巧总结:

拷出SQL后, 不急着执行,先一次性把原表的SQL全部粘到MySQL这边的脚本页,然后批量替换消除左右括号,批量改TIMESTAMP, 再依次执行SQL会更轻松。

待将来进一步研究

建好表后,导入数据需要一个表一个表来处理,DBeaver中是否有批处理命令?将来再研究吧。

猜你喜欢

转载自blog.csdn.net/m0_54284125/article/details/131484437