数据迁移工具我用的是Navicat Premium1.5,其他工具不知道有没有类似的问题。
1、反斜杠数据迁移失败
字段内容里带有未转义的反斜杠的数据会迁移失败,我们需要把它变为双斜杠,如第二行。
数据量多的话用update语句统一修改:
UPDATE 表名 SET `字段名`='\\\\' WHERE `字段名`='\\';
2、默认值未同步
迁移后我们发现所有数据的默认值都不存在了,一个个改太麻烦,我们可以在mysql里用sql语句查询到所有字段的默认值,顺便用concat函数拼接成vastbase的sql语句,直接复制过去执行就行。
SELECT
concat('ALTER TABLE \"',TABLE_NAME , '\" alter column \"',COLUMN_NAME,'\" set DEFAULT ',IF(COLUMN_DEFAULT='','\'\'',COLUMN_DEFAULT),';')
FROM
information_schema.columns
WHERE
TABLE_SCHEMA = 'test_table'
AND COLUMN_DEFAULT is not null;
复制这里的语句直接在新库执行,非常方便。
注意:vastbase的sql语句中,表名和字段名一定要用双引号包裹起来!!!
如果表名或者字段名是关键字、或者有驼峰的形式,可能会修改失败!
*注意:这里有个很重要的问题,数据迁移后主键没有继承自增属性!
这个是Navicat工具mysql的表设计界面,这里有个选项可以看到主键是否是自增的
这个是Navicat打开vastbase表设计的界面,发现我们看不出主键直接有自增属性
通过询问专业人员,自增属性就是给主键一个"AUTO_INCREMENT"的默认值,也就是这样:
于是,我们在mysql库里查出所有的自增主键,拼接成sql,然后统一修改:
SELECT
concat('ALTER TABLE \"',TABLE_NAME , '\" modify \"',COLUMN_NAME,'\" ',DATA_TYPE,' AUTO_INCREMENT;')
FROM
information_schema.columns
WHERE
TABLE_SCHEMA = 'test_table'
AND EXTRA = 'auto_increment';
这个sql是他提供的方案,修改默认值的方法应该也可以
3、数据格式问题
3.1、bool值查询问题(这个不知道什么时候兼容了,现在好像没有这个问题)
我们知道在mysql里不存在bool类型的值,一般是以tinyint类型存储的,但我们可以用字段名=true/false来查询,mysql会自动把true转为1,false转为0
但是在vastbase库里,tinyint类型迁移后对应的是int2类型,我们直接用bool值查询会报错
如果我们代码里对应的实体类是bool类型,那么查询,插入等操作都可能会失败,它不会把bool值转为数值类型,需要把bool类型的实体类转为int类型或者将数据库字段修改为bool类型,sql语句如下:
// 将admin_backenduser表的deleted 字段改为bool类型
ALTER TABLE "admin_backenduser" ALTER COLUMN "deleted" TYPE boolean;
3.2、时间格式
mysql里的datetime类型对应vastbase里的timestamptz类型,数据格式会有变化,可能会导致原来的代码解析失败:
然后我用Navicat工具发现无法成功将timestamptz修改为timestamp类型
查询官方文档,我们需要的数据类型为"timestamp without time zone"
用语句试了下,修改成功!数据格式也变了!
ALTER TABLE "test_table" ALTER COLUMN "create_time" TYPE timestamp without time zone;
OK~,用同样的方法在mysql库里查到所有类型为datetime的字段,统一修改字段类型:
SELECT
concat('ALTER TABLE \"',TABLE_NAME , '\" ALTER COLUMN \"',COLUMN_NAME,'\" TYPE timestamp without time zone;')
FROM
information_schema.columns
WHERE
TABLE_SCHEMA = 'test_table' AND COLUMN_TYPE = 'datetime'
ORDER BY
TABLE_NAME;