---
title: 源码SQL转换
description: "**表1 转换关系**"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/portingadvisor/sourcecodeporting/DevKit_Porting_0102.html
sourcePath: /source/zh/kunpengdevps/portingadvisor/sourcecodeporting/DevKit_Porting_0102.html
indexId: cfdd13a5785973f80ee8950eb548398654bb0f046f1b34af1a129608337b0fad81
---
# 源码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。 | 格式为：[数据库].[表名] [列名]，例如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;
```
