从Access 2003迁移到MariaDB
我们正在将内部Access 2003应用程序的数据库部分迁移到MariaDB,前端使用.Net(C#)。
使用工具来减少工时的尝试,但最后得出了只能采取以下直接的方法来解决问题的结论。
-
- 在Access侧的表中,尽可能应用Not Null约束… 在后续的数据迁移查询执行过程中,如果有Null,那么INSERT SELECT语句就会失败,因此需要根据是否存在Null来执行不同的查询。
由于字符串类型通常被视为空字符串,以下步骤可以机械地执行:
如果不是字符串类型,则往往无法确定应该用什么值替换NULL,因此暂时以NULL值固定进行迁移,然后逐列进行单独迁移(UPDATE DEST.COL=SRC.COL WHERE SRC.COL IS NOT NULL)。
允许目标列为空字符串。
在更新目标列的部分,如果为NULL,则添加将其替换为空字符串的处理。
如果表单与数据相关联,并且不是通过SQL而是通过DoCmd进行处理,则稍后添加SQL会导致竞争错误,因此只需使用Nz函数将表单的值替换为NULL即可。
在创建向导中创建的屏幕等中,如果没有明确指定数据更新处理,则在添加/更新表单之前的处理事件中应用Nz函数。
用UPDATE语句将目标列的NULL替换为空字符串。
在目标列上应用NOT NULL约束。
在MariaDB中,创建一个新的与原表具有相同布局的表。也要实施引用约束。
安装MariaDB的ODBC驱动程序,并将目标MariaDB注册为ODBC。
将MariaDB表注册为Access的链接表
创建将数据从Access表流向MariaDB表的(INSERT SELECT)查询,进行首次迁移。
从引用完整性约束中,确定可迁移的顺序。
创建用于访问MariaDB数据的前端程序。
在迁移后的表布局本身上进行程序的操作验证。
完成前端程序的创建后,对MariaDB的所有数据进行Truncate,并进行实际数据迁移。
以与数据迁移相反的顺序执行时,有时无法通过引用完整性约束删除数据。直接暂时删除参考完整性约束,在数据删除完成后重新创建。
接下来我们将仔细重构表名和列名中存在空格和多字节字符的命名规则不符以及明显是数量数据却被声明为字符串类型的问题。同时进行上述步骤和重构是有很大风险的。