Oracle新增取值10-180默认30的数值列报ORA-00907错误求解
错误原因
你写的SQL一共有3个问题,其中直接触发ORA-00907报错的是语法顺序错误:
- 列定义子句顺序不符合Oracle语法规范:新增列时
DEFAULT默认值的定义必须放在CHECK约束之前,你把DEFAULT写在了CHECK约束的闭合括号之后,SQL解析器读到不符合顺序的关键字时,无法正确识别结构,就抛出了"缺失右括号"的误导性报错,并不是真的少写了括号。 - CHECK约束的取值逻辑写反了:你写的判断条件是
tiempo_empleado <= 10 AND tiempo_empleado >= 180,这个条件永远不可能成立,和你要求的"取值范围10到180"完全相反。 - 存在大量无意义的嵌套括号:数值常量、判断条件外都套了多余的括号,很容易造成括号匹配混乱,虽然不会直接触发报错,但会大幅降低SQL可读性。
修正后的SQL
基础版本可以直接执行:
ALTER TABLE avisos ADD tiempo_empleado NUMBER(3,0) DEFAULT 30 CHECK (tiempo_empleado >= 10 AND tiempo_empleado <= 180);
如果想方便后续维护约束,推荐给CHECK约束显式命名,同时用BETWEEN简化范围判断,效果完全等价:
ALTER TABLE avisos ADD tiempo_empleado NUMBER(3,0) DEFAULT 30 CONSTRAINT chk_avisos_tiempo_range CHECK (tiempo_empleado BETWEEN 10 AND 180);
内容的提问来源于stack exchange,提问作者juan rangel
相关产品推荐
相关产品推荐

