Mysql迁移到达梦数据库-Mysql到DM的应用迁移-给自增列赋值-GroupBy语法不兼容
把基于Mysql的应用移植到达梦数据库,我们进程碰到下面两个问题。
场景一:
在完成了数据和应用系统的移植后,应用一启动,看到日志框框报错:无法给自增列赋值。
【仅当指定列列表,且 SET_IDENTITY_INSERT为ON时,才能对自增列赋值】
场景二:
SQL写法不支持,应用执行遇到报错:【无效的ORDER BY字句】【不是GROUP BY表达式】
select v1 from test group by v1 order by v2;--err 无效的ORDER BY子句
select v1,v2 from test group by v1 order by v2; --err 不是 GROUP BY 表达式
处理方法这是Mysql迁移到达梦数据库,需要知道的基础知识点第二篇:总结三句话。
- 达梦数据库和Oracle一样,无法直接对自增列赋值,Mysql的自增列语法,建议改成取序列值,依然可以保持default属性。
- 达梦数据库对Mysql的不符合SQL标准的Group 和Order,已经提供了兼容,但是要修改数据库配置文件COMPATIBLE_MODE为4。
怎么设置可以赋值的自增列属性
我们可以用序列作为默认值,来实现自增列的可插入性,但是要注意,业务逻辑并不等价,需要自己考量。(注:本来给自增列赋值这个特性,是用的不太合理的)
下面是Mysql5.6的自增列插入例子:
下面是DM(或者Oracle)上,通过序列值默认值替换自增列的一个例子【注意:并不完全等价】:
怎么修改COMPATIBLE_MODE为4
登录数据库,执行这个SQL: sp_set_para_value(2,'COMPATIBLE_MODE',4);
执行成功后,重启数据库即可。
修改为4后,关于group 和order之前不兼容的语法报错,就会变得正常,下面是一个简单的例子:
--当兼容模式为4时,也就是执行了sp_set_para_value(2,'COMPATIBLE_MODE',4);后,并重启了达梦数据库服务之后
drop table if exists test;
create table test(v1 int,v2 int,v3 int);
insert into test select level,level,level from dual connect by level<=100;
select v1 from test group by v1 order by v2;--ok
select v1,v2 from test group by v1 order by v2; --ok
--但是当该参数是0的时候,两个目标语句,均报错
-- modify COMPATIBLE_MODE 0
select v1 from test group by v1 order by v2;--err 无效的ORDER BY子句
select v1,v2 from test group by v1 order by v2; --err 不是 GROUP BY 表达式
COMPATIBLE_MODE 默认值为 0 静态参数
是否兼容其他数据库模式。 0:不兼容, 1:兼容 SQL92 标准, 2: 部分兼容 ORACLE, 3: 部分兼容 MS SQL SERVER, 4: 部分兼容 MYSQL,5:兼容 DM6, 6: 部分兼容 TERADATA
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。