问题描述
使用Data Studio进行表的创建后,对该表使用查询语句总是会出现“XXX是一个未定义的名称”的错误。如图:
使用Data Studio的默认设置创建的表(非手动SQL脚本创建),无论是在Data Studio脚本编辑器还是命令行中都会出现这种错误,原因在于使用Data Studio自动建表时自动生成的DDL中会对所有的对象名添加双引号。如图:
也就是说,SQL语句中的表名和列名都需要加上双引号才能正常执行。(注:字符串是单引号)如上面的查询语句改为:
select * from "Student"
就能够执行了。还要注意的是,DB2 中对于双引号括起来的表名,列名是大小写敏感的,"Student"写成"student"同样会出错。
解决办法
其实,出现这种双引号的问题的原因是DB2的对象大小写规则的问题。
使用SQL创建表或列对象时指定的表名,列名无论大小写,DB2全部都会自动转换为大写。如创建名为Student的表,创建完成后表名变成STUDENT。
如果一定要使用小写,就需要使用双引号将表名,列名等对象括起来,这样DB2就不会进行自动转换了,但同时在这样的表,列参与查询时,也必须使用双引号括起来。
预防双引号的产生
而在Data Studio中,自动生成DDL的默认设置是:一旦对象名含小写字符,就使用双引号括起来,全大写就不用双引号。例如上图中的DLL,Student,Name,Age都自动加了双引号,但ID就没有加。
所以解决的办法有以下几种:
1.指定表名,列名等对象时都统一指定为大写的;
2.手动使用SQL语句完成操作,避免使用DDL自动生成(避免多管闲事);
3.修改自动生成的DDL后再执行(去掉双引号后创建出来的对象就都是大写的);
4.设置Data Studio。在“首选项”->“数据管理”->“DDL生成”中,去掉“缺省情况下数据库对象标识加上引号”前的勾,这样生成的DDL就不会带双引号了。不过这个设置在我的Ubuntu下无效,不知道是不是个例。
处理产生的双引号
如果带双引号的表或列已经生成了,想要去掉双引号该怎么办呢?(毕竟带双引号查询不方便)
方法就是进行表或列的重命名。
DB2的表重命名语句是:
RENAME TABLE 表名 TO 新表名
(无论新表名是大写还是小写,都自动转换为大写,如:rename table "Student" to student,重命名表为STUDENT。索引重命名语法也一样)
DB2的列重命名语句是:
ALTER
TABLE 表名 RENAME COLUMN
列名 TO 新列名
(同样,新列名也自动转换为大写。如alter table STUDENT rename column "Name" to name,重命名列Name为NAME)