达蒙DM数据库使用经验 + DM和MYSQL的区别

一,达梦数据库下载安装

版本区别
https://eco.dameng.com/document/dm/zh-cn/start/dm-version-differences.html

版本选择
https://eco.dameng.com/document/dm/zh-cn/start/dm-version-acquisition.html

下载地址
https://eco.dameng.com/download/

windows安装
https://eco.dameng.com/document/dm/zh-cn/start/install-dm-windows-prepare.html

linux安装
https://eco.dameng.com/document/dm/zh-cn/start/install-dm-linux-prepare.html

二,达蒙数据库使用

1,使用DM管理工具(专有的客户端连接工具)
/tool/manager.exe

2,DM数据库操作
https://eco.dameng.com/document/dm/zh-cn/start/dm-create-tablespace.html
什么是表空间?
表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表, 所以称作表空间。
https://blog.csdn.net/weixin_44559140/article/details/124816402

三,DM的数据类型与操作符
https://eco.dameng.com/document/dm/zh-cn/pm/dm8_sql-data-types-operators.html

四,DM的sql语言使用手册
https://eco.dameng.com/document/dm/zh-cn/pm/function.html

DM数据库管理工具为tool目录下的
在这里插入图片描述
在这里插入图片描述

DM表/字段注释

注:dm数据库无法在建表的同时为字段名添加注释

//为表添加注释
comment on table 库名.表名 is '表注释';
//为表字段添加注释
comment on column 库名.表名.列名 is '列注释';

DM查询错误:无效的表或视图

1,确认表一定存在
2,DM默认查询的是用户名所对应的库名的表,若要查询非用户名对应库名的表需要加上库名.表名查询

DM表自增列管理

将表中的某列转换成自增列且以前存在的数据不变,从当前最大值开始实现自增,以下是解决步骤:

1,先将TABLE3表名右击重命名成TABLE2
2,再右击已重命名的表名TABLE2,选择【生成SQL脚本】-> 【Create to】-> 【新SQL编辑器】
3,将创建表的语法粘贴到新SQL编辑器后,,将表名修改成重命名前的表名,将id列的类型修改成int或者bigint类型,再加上自增列的当前值和增长值,其他语法不变( 语法格式
               IDENTITY [ (种子, 增量) ])
 4,创建好表后,再利用insert .. select ..语法将TABLE2的数据插入到新创建的TABLE3表中,要注意加上列名
 5, 执行以下sql,关闭自增长:SET IDENTITY_INSERT "SYSDBA"."TABLE_3"  ON
 6, 执行以下sql,开启自增长:SET IDENTITY_INSERT "SYSDBA"."TABLE_3"  OFF

DM序列管理

1,创建自增序列(从1开始自增1):

create sequence s1
start with 1  --开始值
increment by 1 --每次增加多少
maxvalue 200 --最大值
nocache/cache  --是否缓存
nocycle/cycle  --是否循环

例子:
CREATE SEQUENCE SEQ_flow_dept START WITH 1 INCREMENT BY 1 MAXVALUE 200000 NOCYCLE;

2,获取序列下一个值

select SEQ_flow_dept.NEXTVAL;

3,获取序列当前值

select SEQ_NOCYCL.CURRVAL;

4,查看序列状态

select * from dba_sequences where sequence_name='s1';

5,修改序列

ALTER SEQUENCE [ <模式名>.] <序列名> [ <序列修改选项列表>];
INCREMENT BY <增量值>|
MAXVALUE <最大值>|
NOMAXVALUE|
MINVALUE <最小值>|
NOMINVALUE|
CYCLE|
NOCYCLE|
CACHE <缓存值>|
NOCACHE|
ORDER|
NOORDER |
CURRENT VALUE <当前值 >

例子:
alter sequence s2 maxvalue 50;
alter sequences s2 minvalue -1000;

6,删除序列

DROP SEQUENCE [IF EXISTS] [ <模式名>.]<序列名 >
参数:
    <模式名> 指明被删除序列所属的模式,缺省为当前模式;
    <序列名> 指明被删除序列的名称。
例子:
drop sequence s2;

DM锁表解决方案

查看锁等待视图
select * from v$trxwait;
查看连接会话
SELECT * FROM v$sessions WHERE trx_id in (select id from v$trxwait)
关闭会话
sp_close_session(sess_id);

错误信息

1,No row with the given identifier exists: [com.sinosoft.authorization.module.

有两张表,table1和table2.产生此问题的原因就是table1里做了关联<one-to-one>或者
<many-to-one unique="true">(特殊的多对一映射,实际就是一对一)来关联table2.
当hibernate查找的时候,table2里的数据没有与table1相匹配的,
这样就会报No row with the given identifier exists这个错.

用数据库的解释:用父表B表的ID和子表A表进行关联,即A表中存在一个外键,
这个外键参照了B表的ID。但是现在在A表有某一个或多个外键值,在B表中不存在,这就是违反数据的完整性的约束

达梦数据库时提示‘登录失败次数超过限制’ 然后我切换成SYSDBA账号

-- 查询用户名锁定情况
select username as "达梦数据库用户名", account_status as "账户状态",lock_date as "锁定时间",* from dba_users;

发现有用户名的用户状态出现LOCKED,然后查询设置的失败次数限制以及锁定时间

-- 查询达梦数据库用户名登录失败设置
select b.username as "达梦数据库用户名",a.failed_num as "失败次数限制",a.failed_attemps as "失败尝试次数",a.lock_time as "锁定时间(min)" from sysusers a right join all_users b on a.id=b.user_id;

如果不想等时间失效可以执行一下语句对其进行解锁操作

alter user 填写要解锁的用户名 account unlock;

可以执行下面语句进行查询导致数据库被锁的操作ip

select * from SYSACCHISTORIES

DM和MYSQL的区别

1,dm不支持FIND_IN_SET函数,可在DM中自定义FIND_IN_SET函数使用
在这里插入图片描述

2,关键字导致的报错:如ref,comment,top,domain,user等
会报语法分析出错,关键字也不能作为表的别名

3. 查询列包含大字段,导致的报错
Error -2685: 第42 行附近出现错误:
试图在blob或者clob列上排序或比较
解决方案:需要将数据库参数ENABLE_BLOB_CMP_FLAG设置为1,
之后数据库便支持查询列,以及DISTINCT、ORDER BY、分析函数和集函数支持对大字段进行处理。

4. convert和using函数不支持导致的报错
Error -2007: 第 32 行, 第 85 列[using]附近出现错误:
解决方案:
找到错误语句:convert(e.expert_name using gbk) asc
该功能是为了按照拼音首字母排序,
替换为 NLSSORT(e.expert_name,‘NLS_SORT = SCHINESE_PINYIN_M’)即可解决。

5. where条件后的字段值使用双引号导致
Error -2111: 第36 行附近出现错误:
无效的列名[topic]
解决方案:
字段名是小写的情况下,字段值必须使用单引号,因为双引号会把值当成列名。所以需要把双引号改为单引号,
如:and d.data_type=“topic” 改为 ‘topic’

6. 自增主键导致,表设置了主键自增,但是insert语句又设置了主键值
Error -2723: 仅当指定列列表,且SET IDENTITY_INSERT为ON时,才能对自增列赋值
解决方案:
需要考虑是否分表,如果是分表,去掉表的自增;如果是普通单表,可以去掉自制定的主键值。
注意:如果想直接获取自增主键ID的值,可以在sql方法上加上一下两个属性:
useGeneratedKeys=“true” keyProperty=“id”

7. 使用单引号修饰查询列别名导致
Error -2007: 第 4 行, 第 220 列[']附近出现错误:
语法分析出错
解决方案:查询列可以用双引号修饰,也可以不用引号修饰,但不能使用单引号,因为单引号是用来修饰字段值的
如b.notice_student_read_id AS ‘notice_read_id’ 必须改为 b.notice_student_read_id AS notice_read_id

8. 日期运算语法不支持date_sub&date_add导致
解决方案:
获取七天前的时间:date_sub(now(),interval 7 day ),
获取30分钟后的时间:date_add(NOW() ,INTERVAL 30 minute)
替换为 ADD_DAYS(GETDATE(), -7) ,sysdate + 30 / 24 / 60

9. group_concat语法不支持导致
Error -2207: 第24 行附近出现错误:
无法解析的成员访问表达式[group_concat]
解决方案:
group_concat(r.role_name)替换为 VM_CONCAT (r.role_name,‘,’)

10. 修改语句的列重复导致
Error -2114: 第77 行附近出现错误:
重复的列名[invalid]
解决方案:去除多余的查询列 invalid 即可

11. 日期转换格式语法不支持导致
解决方案:
DATE_FORMAT(start_time, ‘%Y-%m-%d %H:%i’)
替换为 TO_CHAR(start_time, ‘YYYY-MM-DDHH24:MI’) 即可

12. 日期运算DATEDIFF语法不支持导致
解决方案:
DATEDIFF (now(), send_time) <= 60
替换为 sysdate - send_time <= 60

13. 模糊查询like语法不支持导致
解决方案:
AND name LIKE “%”‘宁海’“%”
替换为 AND regexp_like(name,‘宁海’) 或like concat(‘%’,‘xxx’,‘%’)

14. DM不支持if语法,需要用case when 条件判断语句去做替换;

15. DM自定义函数和mysql自定义函数区别

-- dm自定义函数
CREATE OR REPLACE FUNCTION getDepartChilds(rootId in varchar(36)) RETURN VARCHAR(10000)
AS  ptemp VARCHAR(10000)='';
    ctemp VARCHAR(10000)='';
BEGIN
   SET ptemp = '#';
    SET ctemp = CAST(rootId AS VARCHAR);

WHILE ctemp IS NOT NULL 
LOOP
SET ptemp = CONCAT(ptemp, ',', ctemp);
SELECT WM_CONCAT(id) INTO ctemp FROM sys_depart WHERE FIND_IN_SET(PARENT_ID, ctemp)>0;
END LOOP;
RETURN ptemp;
END;

-- mysql自定义函数
create function getDepartChilds(rootId varchar(36)) returns varchar(10000) DETERMINISTIC
BEGIN
    DECLARE ptemp VARCHAR(10000);
    DECLARE ctemp VARCHAR(10000);
    SET ptemp = '#';
    SET ctemp = CAST(rootId AS CHAR);
    WHILE ctemp IS NOT NULL
        DO
            SET ptemp = CONCAT(ptemp, ',', ctemp);
            SELECT GROUP_CONCAT(id)
            INTO ctemp
            FROM sys_depart
            WHERE FIND_IN_SET(PARENT_ID, ctemp) > 0;
        END WHILE;
    RETURN ptemp;
END

16 DM数据库不支持@rownum获取行号,DM使用rownum获取行号

17 DM更新sql的set操作同一字段不允许出现多次

18 DML语句中条件不能再最外面用!
在这里插入图片描述
19 DM的sql控制台中对特殊字符需要转义


1&字符
	&字符在DM数据库中有传递变量的作用,如果在字符串中含有&字符,会提示输入变量值:
	select '&amp';
	解决方法时使用ASKII码和字符串拼接转义&select chr(38)||'amp;';

2,关键字符和双引号
    有关键字符时,需要对连接串中的包含关键字的密码用双引号括起来;
    如密码为:123@123,则需要书写成:"123@123"

    有双引号时,需要用引号括起来,同时需要用双引号对双引号进行转义;
    如密码为:123"@123,则需要书写成:"123""@123"
    
	linux下密码例子
		假设SYSDBA的密码为:123@123时,最终写法:disql SYSDBA/'"123@123"'
		假设SYSDBA的密码为:123"@123时,最终写法:disql SYSDBA/'"123""@123"';
		假设SYSDBA的密码为:123'@123时,最终写法:disql SYSDBA/"\"123'@123\"";
		假设SYSDBA的密码为:123'$123时,最终写法:disql SYSDBA/"123'\$123";
		假设SYSDBA的密码为:123'"123时,最终写法是:disql SYSDBA/"\"123'\"\"123\"";
		假设SYSDBA的密码为:123'"@$123时,最终写法是:disql SYSDBA/"\"123'\"\"@\$123\"";

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值