人大金仓与mysql的差异与替换

人大金仓与mysql的差异与替换

码农世界 2024-06-14 后端 101 次浏览 0个评论
  1. 人大金仓中不能使用~下面的符号,字段中使用”,无法识别`
  2. 建表语句

    创建表时语句中只定义字段名.字段类型.是否是否为空

    Varchar类型改为varchar(长度 char)

    Int(0) 类型为int4

    定义主键:CONSTRAINT 键名 主键类型(主键字段)

    添加列注释:

    COMMENT ON COLUMN “模式”.”表名”.”字段名” IS ‘注释’

    如下:

DROP TABLE IF EXISTS "se_tools_library_catalog";
CREATE TABLE "se_tools_library_catalog"  (
  "ID" varchar(100 char)  NOT NULL,
  "CATALOG_NAME" text  NULL ,
  "EXPLAIN" text  NULL,
  "PARENT_ID" varchar(100 char)  NULL,
  "ORDERNUMBER" decimal(65, 30) NULL,
  "TAG" int4 NULL,
 CONSTRAINT "se_tools_library_catalog_constraint_1" PRIMARY KEY ("ID")
);
COMMENT ON COLUMN "public"."se_tools_library_catalog"."ID" IS '数据id';
COMMENT ON COLUMN "public"."se_tools_library_catalog"."CATALOG_NAME" IS '分类夹名称/工具名称';
COMMENT ON COLUMN "public"."se_tools_library_catalog"."EXPLAIN" IS '关联父id';
COMMENT ON COLUMN "public"."se_tools_library_catalog"."PARENT_ID" IS '下载时间';
COMMENT ON COLUMN "public"."se_tools_library_catalog"."ORDERNUMBER" IS '排序字段';
COMMENT ON COLUMN "public"."se_tools_library_catalog"."TAG" IS '标识字段分类夹/工具';
COMMENT ON TABLE "public"."se_tools_library_catalog" IS '工具库文件夹分类';

3.string_agg替代GROUP_CONCAT

人大金仓无法使用GROUP_CONCAT函数,由String_agg(字段名,分隔符)替代,分隔符不可省略

若要使用多字段合并使用|| ’ '||分隔字段

如:

select string_agg(name || ''||version,',') from se_pro_config_development where project_id='4MBRH4NKTUKG' and type='1' and version is not null

人大金仓与mysql的差异与替换

4.计算时间差,字符串需转换日期型计算

人大金仓计算时间差,如果是字符串类型数据不能直接相减,使用Date转型

如下:

Mysql:

select (s1.plan_end_time-s1.plan_start_time)+1 as TIMES from se_task_import s1

人大金仓:

select Date(s1.plan_end_time)-Date(s1.plan_start_time)+1  as TIMES from se_task_import s1

5.to_number函数

(1)使用to_number去转换一个long型字段,会造成

com.kingbase8.util.KSQLException: 错误: 值 “3059376192540000” 超出类型 integer 的范围

(2)若字段值中是小数,不可使用to_number函数转换数字型,使用+0.0

人大金仓与mysql的差异与替换

人大金仓与mysql的差异与替换

6.数据库大小写

当前数据库使用的是大小写敏感,所有列名转换为大写,请注意实体类中使用字段名小写或者大写,勿使用大写小混杂,否则无法识别

7.NLSSORT函数

人大金仓数据库无法使用NLSSORT函数

8.group by

人大金仓group by语句比mysql更严格,使用group By 后select查询的字段必须在group by中使用,人大金仓使用的group by的查询结果只包含聚合函数及分组字段

Mysql:

select count(*),name from test group by type

人大金仓:

select count(*),name from test group by type,name

9.日期类型转换

人大金仓中日期转换无法使用DATE_FORMAT,与oracle 一致使用to_date,to_char用于日期和字符串转换

10.列名格式

人大金仓数据库中新增数据,列名不可使用’,必须使用”

格式如下:

INSERT INTO "public"."se_check_org_item"
("id", "checklist_id", "parent_id", "check_item", "description", "item_type", "row_sort_order", "create_time", "creator", "cut_flag")
VALUES('', '', '', '', '', 0, 0, '', '', '');

11.locate函数替代

MySql 中的 LOCATE 函数判断 字符串在另一个字符串中出现的位置, 用 strpos 函数替换

如:select * from SE_PRO_CONFIG_DEVELOPMENT where strpos('root',parent_id)=0;

12.索引

KingBase ES V8R6支持的索引类型如下:

  • B-tree索引

    B-tree索引是Kingbase ES的默认索引,内部采用的B+树( N叉排序树)实现,由于树状结构每一层节点都有序列,因此非常适合用来做范围查询和优化排序操作。B-tree索引支持的操作符有 >, <, >=, <=, =, IN, LIKE等,同时,优化器也会优先选择B-tree索引来对ORDER BY.MIN.MAX.MERGE JOIN进行有序操作。

    使用示例:

    create index i_btree on tab_btree using btree(id);
    explain analyze select * from tab_btree where id < 10;  --有btree索引     
    
    • 2.Hash索引

      HASH索引查询效率比BTREE高得多,相比BTREE索引需要从根节点查询到叶子节点,且需要多次IO及CPU操作,HASH索引因其索引结构的特殊性,理想情况下仅需一次检索即可定位到数据。

      与此同时,HASH也存在一定的局限性,只适合做等值查询。由于HASH索引是通过比较哈希值来做定位,因此当查询列上有较大比例的重复值时,会带来严重的哈希冲突,进而影响查询速度,这种情况下就不建议使用HASH索引。

      使用示例:

      create index i_hash on tab_hash using hash(id);
      explain analyze select * from tab_hash where id < 10; --HASH索引不支持非等值操作
      
      • 3.GiST索引

        GIST意为通用搜索树,是一种平衡的.树状结构的访问方法。GIST索引适用于多维数据类型和集合数据类型,可以用来做位置搜索,如包含.相交.左边.右边等。

        使用示例:

        create index i_gist on tab_gist using gist(po);
        explain analyze select * from tab_gist where po << point(100,100); --查询po列上在(100,100)左边的点
        

        4.SP-GiST索引

        SP-GiST是“空间分区GiST”的简称。SP-GiST支持分区搜索树,它可用于开发各种不同的非平衡数据结构索引,如四叉树.k-d树和radix树。这些数据结构的共同点是:它们反复地将搜索空间划分成大小不等的分区。与GiST索引类似,SP-GiST可作为一种基础模板来实现多种搜索方法。

        使用示例:

        create index i_spgist on tab_spgist using spgist(location);
        explain analyze select * from tab_spgist where location~=point(100,999);
        
        • 5.GIN索引

          GIN是倒排索引,主要适用于包含多个组合值的查询,如数组.全文检索等。

          使用示例:

          • create index i_gin on tab_gin using gin(to_tsvector(‘english’,

            info)); analyze; explain analyze select * from tab_gin where

            to_tsvector(‘english’, info) @@ plainto_tsquery( ‘hello’);

            –使用GIN索引的全文检索

            14.on duplicate key update 替代

            on duplicate key update 由 ON CONFLICT(key) do update set 替代,该方法用于批量插入时,若主键已存在则更新指定字段

            Mysql:

            insert into se_task_plan_template  
               (id,plan_start_time,plan_end_time)  values   (
               '4P0OOXCDSA9S','2023-06-21','2023-06-21' ), (
               '4P016ZXT5M2O_4E3D3KHDI96O_cut_resolve','2023-06-21','2023-07-12' )
               on duplicate key update plan_start_time=values(plan_start_time),
               plan_end_time=values(plan_end_time) ;
            

            kingbase:

            insert into se_task_plan_template   (id,plan_start_time,plan_end_time)  values   ( '4P0OOXCDSA9S','2023-06-21','2023-06-21' ), ( '4P016ZXT5M2O_4E3D3KHDI96O_cut_resolve','2023-06-21','2023-07-12' )
            ON CONFLICT(id) do update set plan_start_time=EXCLUDED.plan_start_time, plan_end_time= se_task_plan_template.plan_end_time ;
            

            注意:

            ON CONFLICT(key) 此处的key必须是主键,未设置主键会报错

            SQL 错误 [42P10]: 错误: 没有匹配ON CONFLICT说明的唯一或者排除约束 com.kingbase8.util.KSQLException: 错误: 没有匹配ON CONFLICT说明的唯一或者排除约束

            若使用语句中值,如下:

            EXCLUDED.字段名

            若使用原表的某个字段值,如下:

            se_task_plan_template.字段名

            15.查询列别名中文格式

            人大金仓中若需定义中文别名,使用双引号

            select name "名称" from se_project
            

            人大金仓与mysql的差异与替换

            16、 kingbase不能查询空字符(‘’)解决方法:ora_input_emptystr_isnull修改为off

            人大金仓与mysql的差异与替换

            17、 转换字符串为数字类型+0.0 to_number报错也可直接+0.0或者+0即可

            SELECT sum(nvl(if(ACTUAL_LIMIT_TIME='','0',ACTUAL_LIMIT_TIME),'0')+0.0) actualLimitTime,
            sum(nvl(if(ACTUAL_WORK='','0',ACTUAL_WORK),'0')+0.0) actualWork  FROM SE_TASK_PLAN_TEMPLATE where PROJECT_ID ='47GHCWMQJ4LC' 
             and TASK_MODEL in('qaManageCycle','qaManage') 
            

            18、mysql中的year函数用to_char(时间,’yyyy’).quarter函数用(to_char(时间,’mm’)+2)/3

            19、 Yeakweek()函数用to_char(时间,’yyyyiw’)

            20、 update联查更新报错问题 update 表 inner join 不支持,left join也不支持。需修改为where条件,类似下图修改即可1改为2

            人大金仓与mysql的差异与替换

转载请注明来自码农世界,本文标题:《人大金仓与mysql的差异与替换》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,101人围观)参与讨论

还没有评论,来说两句吧...

Top