达梦SQL语法兼容笔记

1. DDL工具语法

查看库和表列表

# 查看所有数据库
select distinct object_name  from all_objects where object_type='SCH';
# 查看所有可见的表名:
SELECT table_name FROM all_tables;
# 查看用户可见的所有表
SELECT table_name FROM all_tables WHERE owner = 'schema_name';
# 查看当前连接的数据库名
SELECT sys_context('USERENV', 'DB_NAME') FROM dual;

查询环境参数:

# 查询字符集
SELECT value FROM v$nls_parameters WHERE parameter = 'NLS_CHARACTERSET';
# 查询达梦超时时间
SELECT profile_name, idle_time/60 AS idle_minutes FROM dmdba.dm_user_profiles WHERE profile_name = 'DEFAULT';
# 查看DM版本
select BUILD_VERSION from SYS.V$INSTANCE;
# 查询关键字
select * from V$RESERVED_WORDS;
# 查询页大小。除大字段外,一条记录大小不能超过一页
select page();
# 是否从服务器中取出大字段数据(disql)
SET LOBCOMPLETE <OFF(缺省值) | ON>

表结构:

# 类似于mysql中的show columns、show create table 语句
describe table_name
# 查询表的创建语句:
SELECT DBMS_METADATA.GET_DDL('TABLE', 'meet_conference', 'pc3') AS CREATE_STATEMENT FROM DUAL;
# 变更表结构:
ALTER TABLE meet_conference ADD (node INTEGER, parentConfId VARCHAR(255));

索引信息:

# 查询某张表的唯一索引
SELECT ui.index_name, uic.column_name FROM user_indexes ui JOIN user_ind_columns uic ON ui.index_name = uic.index_name WHERE ui.table_name = 'webcal_live_info' AND ui.uniqueness = 'UNIQUE';
# 联表查询某个用户的所有索引信息
select cc.*, c.* from dba_constraints c, dba_cons_columns cc where c.constraint_name = cc.constraint_name and c.owner = 'uc_uniform' and cc.table_name = 'uc_uniform';

# 查询一个表的所有索引条件信息
select * from dba_constraints where table_name = 'conf_summary';
# 查询一个表的所有索引列字段信息
select * from dba_cons_columns where table_name = 'conf_summary';

# 查询一个具体约束包含的列字段
select * from dba_cons_columns where constraint_name = 'CONS134225131';
# 查询一个具体约束的条件信息
select * from dba_constraints where constraint_name = 'CONS134225131';

2. 支持自增列插入值

方法:通过设置数据库参数IDENTITY_INSERT来实现。
示例:

SET IDENTITY_INSERT  ums.tang_ums_product ON WITH REPLACE NULL;   
INSERT INTO ums.tang_ums_product (id, name, url, "type") VALUES ('60000', '云会议', 'MeetNow', '0'); 
SET IDENTITY_INSERT  ums.tang_ums_product OFF;

3. 支持大字段比较

方法:修改数据库参数 ENABLE_BLOB_CMP_FLAG 为 1

ENABLE_BLOB_CMP_FLAG:是否支持大字段类型的比较。

  • 0:不支持;
  • 1:支持。

设置为 1 后支持 DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。

注意:该参数并不能支持 GROUP BY 对大字段进行处理。

4. 标识符的MySQL兼容

达梦中采用双引号来作为定界标识符,用双引号括起来时标识符体可以包含任意字符。定界标识符的例子:"table","A","!@#$"

在兼容 MYSQL 的模式下,定界标识符的标识符体除用双引号括起来外,还支持使用反引号进行定界或关键字的转义。如下面所示:

`TABLE_NAME``test`

MySQL的兼容模式可以通过修改dm.ini中数据库兼容参数解决:

COMPATIBLE_MODE=4

查看下数据库这个兼容性参数param_value的值:

select * from v$dm_ini where para_name='COMPATIBLE_MODE'

对于通过MySQL兼容模式来支持反引号这个功能,只有在8.1.3.37之后的版本中才支持,之前的版本只能去掉或者通过双引号。

5. disql命令行对引号的转义

以一个例子说明,如果密码是"aaaa"“aaaa”,则SQL语句中书写格式如下:
在这里插入图片描述

  • 最外层的三个双引号分别表示,将密码括起来的双引号,转移双引号,实际密码双引号;
  • 中间四个双引号分别表示转移双引号,第一个密码双引号,转移双引号,第二个密码双引号;

disql命令行连接数据的书写格式:
在这里插入图片描述

6. 引号转义规则

  • 如果是单引号,再加个单引号转义,用两个连续单引号转义成单引号
  • 如果是双引号,再加个双引号作转义,正规标识符不会包含双引号,有一种定界标识符可以有双引号(可以包含任意字符)
  • 其它特殊字符的转义与Mysql一致,例如:制表符、反斜杠、换行、回车
  • 单引号用来包裹字符串值(双引号不行),双引号用来包裹标识符,例如:字段名和表名。
  • Mysql的兼容:将’替换成’',将"替换成""
  • java的话,可以在驱动连接串加上?quoteReplace=1这个进行兼容

7. replace into语法转换

Mysql语法示例:

REPLACE INTO exchange_bindinfo 
	(userId,resId,bindingData) 
values 
	(1,"abcd","101003")

达梦语法示例:

MERGE INTO exchange_bindinfo t
USING dual
ON (t.userId = 1 AND t.resId = 'abcd')
WHEN MATCHED THEN
    UPDATE SET t.bindingData = '101003'
WHEN NOT MATCHED THEN
    INSERT (userId, resId, bindingData)
    VALUES (1, 'abcd', '101003');

8. 联表更新语句转换

Mysql语法

UPDATE TESTB LEFT JOIN TESTA 
ON TESTA.A = TESTB.A 
SET TESTB.B = TESTA.B;

达梦语法:

MERGE INTO TESTB 
USING TESTA 
ON (TESTA.A = TESTB.A)
WHEN MATCHED THEN 
	UPDATE SET TESTB.B = TESTA.B

9. on duplicate key update语句转换

Mysql语法:

insert into webcal_live_info(cal_id,channelId,pullurl,password,extraInfo) values(634311,131722,'https://rlive1uat.rmeet.com.cn/activity/geeZWo3','','{"liveViewFlag":0,"livePlaybackFlag":0,"livePlaybackTime":0,"jointHostUrl":"https://stest.qsh1.cn/a/GVaZkX26ACE2"}') on duplicate key update password='', extraInfo='{"liveViewFlag":0,"livePlaybackFlag":0,"livePlaybackTime":0,"jointHostUrl":"https://stest.qsh1.cn/a/GVaZkX26ACE2"}'

达梦语法:

MERGE INTO webcal_live_info t
USING dual
ON (t.cal_id = 634311 AND t.channelId = 131722)
WHEN MATCHED THEN
    UPDATE SET t.password = '', t.extraInfo = '{"liveViewFlag":0,"livePlaybackFlag":0,"livePlaybackTime":0,"jointHostUrl":"https://stest.qsh1.cn/a/GVaZkX26ACE2"}'
WHEN NOT MATCHED THEN
    INSERT (cal_id, channelId, pullurl, password, extraInfo)
    VALUES (634311, 131722, NULL, '', '{"liveViewFlag":0,"livePlaybackFlag":0,"livePlaybackTime":0,"jointHostUrl":"https://stest.qsh1.cn/a/GVaZkX26ACE2"}');
    

10. 多条数据的on duplicate key update

Mysql语法:

INSERT INTO users (username, email, age)
VALUES ('user1', 'user1@example.com', 25),
       ('user2', 'user2@example.com', 30),
       ('user3', 'user3@example.com', 35)
ON DUPLICATE KEY UPDATE
    email = VALUES(email),
    age = VALUES(age);

达梦语法:

MERGE INTO users u
USING (
  SELECT 'user1' AS username, 'user1@example.com' AS email, 25 AS age FROM dual
  UNION ALL
  SELECT 'user2', 'user2@example.com', 30 FROM dual
  UNION ALL
  SELECT 'user3', 'user3@example.com', 35 FROM dual
) d
ON (u.username = d.username)
WHEN MATCHED THEN
  UPDATE SET u.email = d.email, u.age = d.age
WHEN NOT MATCHED THEN
  INSERT (username, email, age) VALUES (d.username, d.email, d.age);

参考阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉下心来学鲁班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值