鲲鹏社区首页
中文
注册
我要评分
文档获取效率
文档正确性
内容完整性
文档易理解
在线提单
论坛求助

源码SQL转换

系统库转换(MySQL>达梦)

表1 转换关系

MySQL系统库/表/列

达梦系统库/表/列

information_schema.columns column_name

sys.syscolumns name

information_schema.columns is_nullable

sys.syscolumns nullable$

information_schema.columns column_type

sys.syscolumns type$

information_schema.columns column_comment

sys.syscolumncomments comment$

information_schema.columns extra

sys.syscolumns info2

information_schema.columns column_key

sys.syscons type$

information_schema.columns ordinal_position

sys.syscolumns colid

information_schema.columns table_schema

sys.sysobjects name

格式为:[数据库].[表名] [列名],例如information_schema.columns column_name。

SQL语句转换示例:

  • 原SQL语句(MySQL):
    select column_name, column_type, column_comment from information_schema.columns;
  • 转换后SQL语句(DM):
    select sc.name column_name, type$ column_type, scc.comment$ column_comment from sys.syscolumns sc LEFT JOIN SYS.SYSCOLUMNCOMMENTS SCC ON sc.NAME = scc.COLNAME;

replace into语法转换(MySQL>达梦)

replace into可用merge into替代,在达梦数据库中使用merge into语法需要指定唯一键。其功能是在唯一键存在的情况下更新数据,在唯一键不存在的情况下执行插入操作。

SQL语句转换示例:

  • 原SQL语句(MySQL):
    replace into sys_user_role (user_id, role_id) values (3, 3);    --user_id是唯一键,当user_id存在时更新记录,不存在时插入数据
  • 转换后SQL语句(DM):
    MERGE INTO RY.SYS_USER_ROLE 
    USING (select 3 as user_id, 3 as role_id) tmp        --将需要插入或更新的数据以select的方式组成一张临时表tmp
    ON  RY.SYS_USER_ROLE.user_id = tmp.user_id           --以SYS_USER_ROLE表的user_id字段为唯一键和插入的数据的user_id做比较
    WHEN matched THEN                                    --当存在需要插入的user_id时更新表内的数据
    UPDATE SET RY.SYS_USER_ROLE.role_id = tmp.role_id    --更新表中的role_id
    WHEN NOT matched THEN                                --当不存在需要插入的user_id时直接插入数据
    INSERT VALUES ( tmp.user_id, tmp.role_id);

NEXTVAL FOR语法转换(DB2>GoldenDB)

GoldenDB不支持DB2的NEXTVAL FOR语法,可采用替代方案来实现类似序列的功能。支持以下两种方式:

  • 方式一:如果GoldenDB支持序列功能,可以创建序列并使用sequence_name.NEXTVAL来获取序列值。
    1. 创建序列。
      CREATE SEQUENCE my_seq
        START WITH 1          --指定Sequence的起始值
        INCREMENT BY 1        --指定每次调用Sequence时数值的增量
        MINVALUE 1            --指定Sequence的最小值
        MAXVALUE 999999999    --指定Sequence的最大值
        CACHE 20;             --指定预先生成的数值数量并存储在内存中以提高性能
    2. 查询序列值。

      当你需要获取序列的下一个值时,可以使用:

      SELECT my_seq.NEXTVAL;
  • 方式二:如果GoldenDB不支持序列功能,可以通过创建AUTO_INCREMENT表来模拟序列,并使用LAST_INSERT_ID()获取自增值。
    1. 创建模拟序列的表。可以使用AUTO_INCREMENT来模拟序列的自增行为。
      CREATE TABLE seq_table (
          id INT AUTO_INCREMENT,
          PRIMARY KEY (id)
      );
    2. 插入数据并获取自增的ID。

      每插入一条记录时,ID会自动递增。可以通过插入一条记录来获取下一个序列值:

      INSERT INTO seq_table VALUES (NULL);

      获取刚插入的ID,即序列的下一个值:

      SELECT LAST_INSERT_ID();

SQL语句转换示例:

  • 原SQL语句(DB2):
    SELECT NEXTVAL FOR employee_seq FROM SYSIBM.SYSDUMMY1;
  • 转换后SQL语句(GoldenDB):
    1. 创建模拟序列的表。
      CREATE SEQUENCE employee_seq
        START WITH 1
        INCREMENT BY 1
        MINVALUE 1
        MAXVALUE 999999999
        CACHE 20;
    2. 查询序列值。
      SELECT employee_seq.NEXTVAL;