项目场景:
今天,在给某集成商做SQL优化时,无意中发现无法创建索引,创建索引时报错如下
问题描述
今天,在给某集成商做SQL优化时,无意中发现无法创建索引,创建索引时报错如下
在audit字段上创建索引报错,语法分析错误:
原因分析:
在对语法进行了分析,错误代码为-2007,并未发现该创建索引的语句有错误
create index IDX_CMSARTIE_I_A ON CMSARTIE (id,audit) ;
解决方案:
经查,audit为达梦数据库中保留关键词,此次解决的办法在audit字段上加上双引号。
create index idx_cmsartie_i_a on cmsartil(id,"audit")
达梦的关键字/保留字可以在《DM SQL语言使用手册》附录 1 中查询,手册位于数据库安装路径 /dmdbms/doc
文件夹。
下面是处理表语句和关键字或者保留字冲突的方法:
双引号法
这个一般可以用来处理建表语句中的保留字冲突,如表名或者字段名是 DM 的保留字。这种方法一般可以快速地绕过问题,但是对于大小写敏感的库,这种用双引号的方法会固定死字段大小写,对于小写的字段,可能会带来无效的表名或者列名的问题。
dm.ini 中的参数设置
在 dm.ini 中有个参数 EXCLUDE_RESERVED_WORDS,这个参数可以用来屏蔽你想要屏蔽的保留字,将需要屏蔽的保留字写在 = 号后面,然后以逗号分隔。设置在 dm.ini 中的好处就是一旦设置,永久生效而且对所有客户端都有效,这样就不需要在所有客户端系统中进行专门配置。但是设置在 dm.ini 中之后,这个保留字就永久性失效了,哪怕你想通过 Manager 客户端工具在本地连接也没用了。而且该方式还存在一个隐患就是由于屏蔽掉了一些系统的保留字,所以可能会导致系统的一些功能无法正常使用。
不建议用这个参数,会有严重的副作用,并且比较隐蔽;在不改表的字段的情况下,最好的方案是改名字,次之给对象名加双引号。