Oracle创建ORDER_ITEMS表时SIZE、COST列名报错原因咨询
为什么Oracle中
SIZE和COST作为列名会报错? 嘿,这个问题其实很好理解——SIZE和COST之所以不能直接当列名,是因为它们都是Oracle的保留关键字,数据库把这些特定词汇预留出来,专门用于自身的SQL语法、内置功能、系统操作等场景,不允许咱们用户直接拿来当表名、列名这类数据库对象的名称。
具体说下这俩关键字的用途:
SIZE:这是Oracle明确的保留关键字,你平时写SQL可能会碰到它的场景比如:- 在分析函数
LISTAGG里用来限制返回字符串的长度(比如LISTAGG(col, ',') WITHIN GROUP (ORDER BY col) SIZE 1000); - 它属于数据库语法体系里的预留词汇,和数据类型、函数逻辑绑定得很深,自然不能被咱们拿来当列名用。
- 在分析函数
COST:同样是Oracle的保留关键字,主要和查询优化器挂钩:- 你查看执行计划的时候,会看到
COST字段,它代表优化器估算的查询开销; - 一些SQL hint(比如
/*+ COST */)或者优化器相关的配置语句里也会直接用到这个词,所以也被数据库锁定了。
- 你查看执行计划的时候,会看到
可选的解决办法:
除了你已经试过的改名(比如SIZEA、COSTA),还有两种方式可以选:
- 用双引号包裹列名,比如:
CREATE TABLE ORDER_ITEMS( ITEM_NO NUMBER(10), ITEM_DESCRIPTION VARCHAR(50), "SIZE" VARCHAR(5), "COST" NUMBER(8,2), QUANTITY NUMBER(10), TOTAL NUMBER(8,2), ITEM_ORDER_NO NUMBER(10), CONSTRAINT ITM_NO_PK PRIMARY KEY (ITEM_NO) );
不过要注意:这么做之后,后续查询这个列的时候必须也用双引号包裹,而且大小写敏感——比如你定义的是"SIZE",查询时写size就会报错,所以这种方式一般不推荐,除非万不得已。
2. 给列名加语义化前缀/后缀,比如改成PRODUCT_SIZE、UNIT_COST,这样既保留了原本的含义,又完美避开了关键字冲突,是更规范的做法。
内容的提问来源于stack exchange,提问作者AdsMont
相关产品推荐
相关产品推荐

