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 THENUPDATE SET t.bindingData = '101003'
WHEN NOT MATCHED THENINSERT (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 THENUPDATE SET t.password = '', t.extraInfo = '{"liveViewFlag":0,"livePlaybackFlag":0,"livePlaybackTime":0,"jointHostUrl":"https://stest.qsh1.cn/a/GVaZkX26ACE2"}'
WHEN NOT MATCHED THENINSERT (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 UPDATEemail = VALUES(email),age = VALUES(age);
达梦语法:
MERGE INTO users u
USING (SELECT 'user1' AS username, 'user1@example.com' AS email, 25 AS age FROM dualUNION ALLSELECT 'user2', 'user2@example.com', 30 FROM dualUNION ALLSELECT 'user3', 'user3@example.com', 35 FROM dual
) d
ON (u.username = d.username)
WHEN MATCHED THENUPDATE SET u.email = d.email, u.age = d.age
WHEN NOT MATCHED THENINSERT (username, email, age) VALUES (d.username, d.email, d.age);
参考阅读
- dm8 password转义:https://eco.dameng.com/community/question/276215ad690cd0310ce60ab368f48c0f
- 达梦与mysql的引号兼容:https://eco.dameng.com/community/question/45ea31056858e8d877eb6395882e652f