• 数据库迁移-国产化-迁移建议-GreenPlum DB向GBase 8a 迁移


    1. 迁移建议

    下面介绍一下迁移过程常用的一些迁移方法。

    1.1. 连接操作符

    GreenPlum中连接符“||”表示字符串连接,没有concat函数,而在GBase中连接符“||”既可以表示连接也可以表示或。当GBase系统变量sql_mode打开PIPES_AS_CONCAT时,“||”表示连接,和CONCAT函数等价,而当GBase系统变量sql_mode关闭PIPES_AS_CONCAT时,“||”表示或。

    注意GBase在默认安装时会打开PIPES_AS_CONCAT参数,因此在应用系统迁移时,原有的连接符“||”可以不进行修改。如果想确认系统变量是否正确可以使用如下命令查看。

    gbase> show variables like '%sql_mode%';

    1.2. 或操作符

    GreenPlum中”#”表示异或操作符,”^”表示power函数,而在GBase中”#”表示注释,^表示异或。

    GreenPlum中使用操作符”#”表示异或,GBase中表示注释

    数据库

    GreenPlum

    GBase

    语句

    select 1 # 1;

    select 1 # 1 awgege fegegew

    ;

    结果

    0

    1

    GreenPlum中使用操作符”^”表示power函数,GBase中表示异或

    数据库

    GreenPlum

    GBase

    语句

    select 2 ^ 4;

    select 2 ^ 4;

    结果

    16

    6

    1.3. EXCEPT/MINUS函数

    GreenPlum中EXCEPT函数和GBase中MINUS函数等价,表示求两个查询结果的差集,GBase不支持EXCEPT关键字,如果使用会报语法错误。因此,在应用系统迁移时,需要将所有的EXCEPT改成MINUS。

    数据库

    GreenPlum

    GBase

    语句

    create table t1(a int);

    insert into t1 values(1);

    create table t2(a int);

    insert into t1 values(2);

    select * from t1 except select * from t2;

    create table t1(a int);

    insert into t1 values(1);

    create table t2(a int);

    insert into t1 values(2);

    select * from t1 minus select * from t2;

    结果

    1

    1

    1.4. 正则表达式

    GreenPlum中正则表达式的支持非常灵活,支持正则表达式操作符,而在GBase中是不支持的,但是所有的这些操作符都可以使用GBase提供的REGEXP进行替换。此外,GreenPlum和GBase均实现了常见的正则表达式函数,例如regexp_replace函数,可以将模式匹配的字符串替换成指定的函数。

    数据库

    GreenPlum

    GBase

    语句

    drop table if exists t1;

    create table t1(a varchar(10));

    insert into t1 values(‘abc’),(’bcd’),(’cde’);

    select * from t1 where a ~ ‘^(a|b)’;

    drop table if exists t1;

    create table t1(a varchar(10));

    insert into t1 values(‘abc’),(’bcd’),(’cde’);

    select * from t1 where a regexp ‘^(a|b)’;

    结果

    abc

    bcd

    abc

    bcd

    数据库

    GreenPlum

    GBase

    语句

    drop table if exists t1;

    create table t1(a varchar(10));

    insert into t1 values(‘abc’),(’abcabc’);

    select regexp_replace(a, ‘a.c’,’A’) from t1;

    drop table if exists t1;

    create table t1(a varchar(10));

    insert into t1 values(‘abc’),(’abcabc’);

    select regexp_replace(a, ‘a.c’,’A’) from t1;

    结果

    A

    Aabc

    A

    AA

    注意GreenPlum中regexp_replace函数和GBase中的用法存在差异。GBase中默认是替换所有匹配到的字符串,而GreenPlum中只替换第一次匹配到的,如果想替换所有匹配的字符串,则需要额外提供参数’g’。因此在上述示例中如果将GreenPlum中的查询语句写为select regexp_replace(a, ‘a.c’,’A’,’g’) from t1;则查询结果就和GBase保持一致了。

    1.5. 临时表

    在GREENPLUM中,可以创建以下两种临时表:

    1) 会话特有的临时表 
    CREATE TEMPORARY TABLE ON COMMIT PRESERVE ROWS;

    2) 事务特有的临时表 
    CREATE TEMPORARY TABLE ON COMMIT DELETE ROWS;

    例如:

    创建会话特有的表

    create temporary table t1(a int) on commit preserve rows;

    创建事务特有的表

    create temporary table t2(a int) on commit delete rows;

    --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次事务提交后将截断表(删除全部行)

    --ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当事务提交后,表中的数据不会截断,依然会保留。需要说明的是,因为所有的临时表在会话结束时都会被删除,因此在这里将ON COMMIT PRESERVE ROWS建立的表称之为会话特有的临时表。

    GBase也有临时表。但是临时表被限制在当前连接中,当连接关闭时,临时表会自动地删除。这就意味着,两个不同的连接可以使用同一个临时表名而不会发生冲突,也不会与同名现有的表冲突(现有表将被隐藏,直到临时表被删除)。

    CREATE TEMPORARY TABLE temp1

    (id int auto_increment primary key, ClassifiedID int);

    <。。。。。。>

  • 相关阅读:
    css控制卡片内部的左右布局
    引人关注的核酸产业园 | mRNA 疫苗究竟是?
    Java版本+企业电子招投标系统源代码+支持二开+招投标系统+中小型企业采购供应商招投标平台
    OpenCv for java 人脸识别(提供源代码)
    基于vue+node+MySQL的导航可视化系统webapp设计
    【Java基础夯实】变量声明选择包装类还是基本类型有哪些讲究?
    java培训技术通过debug调试流程
    网页的用户注册功能
    力扣(LeetCode)882. 细分图中的可到达节点(C++)
    git:二、git的本地配置+工作区域和文件状态+git add/commit/log +git reset回退版本
  • 原文地址:https://blog.csdn.net/huixinhuiyismile/article/details/126657037