SQL创建order_items表报ORA-00907缺失右括号错误求解
报错根因
你遇到的ORA-00907: missing right parenthesis并不是真的缺失右括号,属于Oracle的经典迷惑性报错,触发原因是列定义的子句顺序不符合Oracle语法规则:
Oracle规定,列定义中DEFAULT默认值声明必须放在NOT NULL非空约束之前,你写的discount字段定义为discount DECIMAL(4 , 2 ) NOT NULL DEFAULT 0,把NOT NULL放在了DEFAULT前面,SQL解析器识别到非法语法时就会抛出这个缺括号的错误,报错定位的第7行第34列刚好就是DEFAULT关键字的位置,和问题点完全匹配。
修复方法
调整discount字段的子句顺序,将DEFAULT 0移动到NOT NULL之前即可,修正后的完整建表SQL如下:
CREATE TABLE order_items ( order_id INT, item_id INT, product_id INT NOT NULL, quantity INT NOT NULL, list_price DECIMAL(10,2) NOT NULL, discount DECIMAL(4,2) DEFAULT 0 NOT NULL, PRIMARY KEY (order_id, item_id), FOREIGN KEY (order_id) REFERENCES orders (order_id), FOREIGN KEY (product_id) REFERENCES products (product_id) );
补充说明
- Oracle中
DECIMAL(precision, scale)是NUMBER(precision, scale)的别名,两种写法执行效果完全一致,不需要额外修改类型。 - 后续再遇到
ORA-00907报错时,不要只检查括号是否匹配:列约束顺序错误、使用了Oracle不支持的语法、关键字拼写/位置错误、非法字符都可能触发这个报错。
内容的提问来源于stack exchange,提问作者Darkin
相关产品推荐
相关产品推荐

