【数据库】Mysql导入Kingbase数据库

了解Kingbase数据库

人大金仓数据库管理系统KingbaseES(简称:金仓数据库或KingbaseES)是北京人大金仓信息技术股份有限公司自主研制开发的具有自主知识产权的通用关系型数据库管理系统。(基于PostgreSQL )

前期准备

1、连接现有的mysql数据库(这个就不详述了,例如:navicat客户端)

在这里插入图片描述

2、安装管理工具和连接kingbase数据库

(1)下载kingbase安装包

登录人大金仓-成为世界卓越的数据库产品与服务提供商下载安装包,实际上客户端工具和数据库软件包是同一个软件包,就是在安装的时候可以选择只安装客户端及完成客户端工具的安装。客户端工具一般用于window客户端,这里选择x86架构的window版本进行下载。 版本:X86、Linux、完整版、V008R006C008B0014
在这里插入图片描述

(2)下载授权文件

登录人大金仓-成为世界卓越的数据库产品与服务提供商下载授权文件压缩包。
在这里插入图片描述

(3)Kingbase数据库安装

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)连接kingbase数据库

打开,数据库开发管理工具
在这里插入图片描述
数据库,新建一个连接
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
数据库名和mysql数据库名保持一致
在这里插入图片描述

开始迁移

3、开始迁移

(1)运行数据迁移工具

在这里插入图片描述
在这里插入图片描述

该工具是一个springboot+vue项目,访问http://localhost:54523/

(2)开始迁移

在这里插入图片描述
迁移时需要配置mysql的数据库信息(源数据库)和kingbase数据库(目标数据库)信息。
在这里插入图片描述

在这里插入图片描述
创建迁移任务
在这里插入图片描述
选择自己的数据库(mysql中的)
在这里插入图片描述
在这里插入图片描述
设置参数,保存迁移即可。
在这里插入图片描述

(3)可能遇到的问题

tinyint类型,在mysql中没问题,但在迁移过程中,会导致不成功,(kingbase明确说支持的,但是还是不成功),最后把mysql中的tinyint类型改成了int
char类型,mysql中的char会被映射到kingbese的varchar,这会导致kingbase中的varchar后面补充空格,出现错误,建议mysql中都改为varchar

4、项目中的语法更改

(1)kingbase不支持mysql中的 反引号 与其相对应的是 双引号

mysql中的语法:name
kingbase中的语法:“name”
(特别注意:在mysql中的type、key是关键字,所以定义属性的时候type,加上单引号的,kingbase中要加双引号,在项目的实体类中也要注意

(2)正则表达式

kingbase 正则表达式 与mysql中 的语法不通 :
mysql 中的语法:name regexp ‘^b.’
kingbase中的语法:name ~ ‘^b.’

(3)字符串包裹

kingbase 与 mysql 字符串差别 mysql中可以使用单引号与双引号包裹 字符串 kingbase只能使用 单引号包裹
mysql 中的语法:insert into users(name,context) values(‘name’,“context”)
kingbase 中的语法:insert into users(name,context) values(‘name’,‘context’)

(4)类型转换(这个是大坑,需要改的好多)

kingbase不支持类型的隐式转换不通类型中必须手动转换(例如:name_id是str的,但在赋值的时候name_id=1,这样出现int 不能赋值给str的错误
mysql 支持类型的隐式转换

(5)replace into:

mysql 中 replace into 是根据 唯一约束 进行查找 如果有数据 删除并且插入新数据,没有则直接插入数据。
kingbase 中没有 replace into 需要使用 merge into 替换。 其语句执行结果是: 根据输入的字段作为条件如果含有则修改,没有则插入
具体替换件如下sql:
merge into “account” a using (select ‘acco0004’ as account_code) b on (a.account_code = b.account_code)
when matched then update set “name”= ‘hello world’
when not matched then insert (“account_code”,“name”) values (‘acco0004’,‘hello’)
解释:
1.“account” 为源表名(要被修改数据的表)
2.(select ‘acco0004’ as account_code) b 判断重复的虚拟表 其中 ‘acco0004’ 为判断依据(根据实际状况替换) account_code 为自定义字段名 可根据实际状况修改
3.on (a.account_code = b.account_code) 过滤条件 如果 account 表中含有 虚拟表b中 acco0004 的值则进行修改操作 account_code 可根据实际状况修改 可使用and连接多个字段 但字段必须 有唯一约束
4.update set “name” = ‘malong’ 如果有则需改 这里只修改了 name 可根据增加替换
5.insert (“account_code”,“name”) values (‘acco0004’,‘bailong’) 如果没有则进行插入

(6)多字段条件:

merge into “account” a using (select ‘acco0001’ as account_code,‘keyc0001’ as key_code) b on (a.account_code = b.account_code anda.key_code = b.key_code)
when matched then update set “name” = ‘hello world’
when not matched then insert (“account_code”,“name”,“key_code”) values (‘acco0001’,‘hello’,‘keyc0001’)
insert ignore into:
mysql 的 insert ignore into 没有数据则插入,有则忽略。
kingbase 没有 insert ignore into 可替换为以下sql:
语句跟replace into差不多 只是缺少了修改:
merge into “account” a using (select ‘acco0002’ as account_code) b on
(a.account_code = b.account_code) when not matched then insert
(“account_code”,“name”) values (‘acco0002’,‘hello’)

(7)DATE_FORMAT :

kingbase 中的to_char函数与mysql中date_format对应,但第二位的参数有所不同
#####(8)FIELD:
kingbase中没有 field 函数 要实现此形式提供以下示例参考:
mysql 语句:
SELECT * FROM account ORDER BY FIELD (name,‘suyoupeng’,‘liushaopeng’,‘huxue’,‘hongjinbao’,‘malong’)
kingbase 语句:
SELECT * FROM account ORDER BY case when name = ‘suyoupeng’ then ‘0’
when name = ‘liushaopeng’ then ‘1’ when name = ‘huxue’ then ‘2’ when
name = ‘hongjinbao’ then ‘3’ when name = ‘malong’ then ‘4’ else name
end ,name
Tips:其中 then 后面的值 需要根据 字段 name 的类型进行调整, kingbase 不支持隐式数据转换

(8)group by(大坑)

kingbase 使用SQL3以前的标准所以在 group by 与mysql的语法相同:
mysql 中group by 用法:
SELECT id,name,age,birthday FROM account WHERE age BETWEEN 20 AND 50
GROUP BY name ORDER BY birthday
如果在kingbase中也达到同样的结果 请转换为以下的sql
select id,name,age,birthday from casecheck.account where id in (select
max(id) from casecheck.account where age between 20 and 50 group by
name ) order by birthday desc
解释:
在kingbase使用group by 必须将显示的字段多键入到group by中。这样的话就导致了数据的不准确
在上面的sql语句中 select max(id) from casecheck.account where age between 20 and 50 group by name 如果 id 不使用聚合函数 max 包裹将会报错,
可能的原因是 group by name字段以后 一个name 对应多个id 此时sql引擎不知道应该显示哪个,使用max聚合函数后 sql 就取最大的id的name了。
得到所有符合条件的id后,再以此做为条件 重新检索数据表。

(9)INET_ATON:

mysql 使用例子:
SELECT INET_ATON(‘192.168.1.90’) AS ip
kingbase 不支持 INET_ATON函数 用以下sql替换
select
to_number(regexp_replace(ip, ‘([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})’, ‘\1’)) * 16777216 +
to_number(regexp_replace(ip, ‘([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})’, ‘\2’)) * 65536 +
to_number(regexp_replace(ip, ‘([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})’, ‘\3’)) * 256
to_number(regexp_replace(ip, ‘([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})’, ‘\4’)) as ip_number
from (SELECT ‘192.168.1.90’ AS ip)

(10)字符串替换replace函数(大坑)

原sql:
where owner like ‘% k e y . r e p l a c e ( " " , " " ) {key.replace("_", "\\_")}%' or name like '% key.replace("",""){key.replace(“", "\”)}%’
or name_cn like ‘% k e y . r e p l a c e ( " " , " " ) {key.replace("_", "\\_")}%' or description like '% key.replace("",""){key.replace(“", "\”)}%’
kingbase适配sql:
OWNER LIKE ‘%’ || REPLACE(‘KaTeX parse error: Expected group after '_' at position 10: {key}', '_̲', '\\_') || '%…{key}’, ‘', '\’) || ‘%’
OR name_cn LIKE ‘%’ || REPLACE(‘KaTeX parse error: Expected group after '_' at position 10: {key}', '_̲', '\\_') || '%…{key}’, ‘', '\’) || ‘%’

总结比较匆忙,如有问题还望大佬指正,谢谢!

参考文献:
[1] https://help.kingbase.com.cn/v8/index.html
[2] https://blog.csdn.net/J20230301/article/details/134854622

  • 28
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值