在上次写的一篇笔记(在Oracle中使用内部关键字做字段名)中我提到用""解决Oracle关键字作为字段名的办法。最近却发现""不同于SQL Server中的[],乱用会造成不必要的麻烦。
发现这个情况源于使用PowerDesigner做数据库设计,我直接使用了它生成的SQL脚本来创建数据库。这当然没有出现问题,但接下来向表中插入数据时却报出了ORA-00904 invalid identifier错误,字段名不存在?由于是用的NHibernate操作数据库加上刚学习这不久,于是怀疑是不是NHibernate用的不对。在仔细查阅了文档并确认映射无误后,又直接写INSERT还是报错,我开始怀疑是字段名的问题。
查看PowerDesigner生成的脚本,所有字段名都加上了"",同时在定义PrimaryKey等约束时也对字段名加上了"",难道说?于是尝试用如下两句建两张表:
CREATE TABLE Table1 (Field1 INT);
CREATE TABLE Table2 ("Field1" INT);
再尝试用如下两句插入记录:
INSERT INTO Table1 (Field1) VALUES (1);
INSERT INTO Table2 (Field1) VALUES (1); // ORA-00904
结果第一句正确,第二句报错ORA-00904,OK这下问题清楚了。可见在Oracle中除非字段名与关键字冲突,否则不要乱用""以免造成不必要的麻烦。
发现这个情况源于使用PowerDesigner做数据库设计,我直接使用了它生成的SQL脚本来创建数据库。这当然没有出现问题,但接下来向表中插入数据时却报出了ORA-00904 invalid identifier错误,字段名不存在?由于是用的NHibernate操作数据库加上刚学习这不久,于是怀疑是不是NHibernate用的不对。在仔细查阅了文档并确认映射无误后,又直接写INSERT还是报错,我开始怀疑是字段名的问题。
查看PowerDesigner生成的脚本,所有字段名都加上了"",同时在定义PrimaryKey等约束时也对字段名加上了"",难道说?于是尝试用如下两句建两张表:
CREATE TABLE Table1 (Field1 INT);
CREATE TABLE Table2 ("Field1" INT);
再尝试用如下两句插入记录:
INSERT INTO Table1 (Field1) VALUES (1);
INSERT INTO Table2 (Field1) VALUES (1); // ORA-00904
结果第一句正确,第二句报错ORA-00904,OK这下问题清楚了。可见在Oracle中除非字段名与关键字冲突,否则不要乱用""以免造成不必要的麻烦。