Oracle建表执行报ORA-00907缺失右括号错误如何解决
ORA-00907缺失右括号报错原因定位
报错的核心原因是你使用的外键行内定义语法不符合Oracle的语法规则:Oracle解析器遇到不识别的语法片段时,经常会抛出ORA-00907这个通用错误,并不是真的少写了右括号。
你代码里的问题出在外键字段的定义行:
DEPOT# INT FOREIGN KEY REFERENCES DEPOT(DEPOT#)
这种在列类型后直接加FOREIGN KEY关键字的写法是MySQL、SQL Server等数据库支持的简写语法,Oracle不支持这种写法,解析到这里就会判定语法非法,抛出缺失右括号的错误。
修正方案
你可以任选以下两种符合Oracle规范的写法建表:
- 方案1:行级外键简写(和你原来的写法最接近,直接去掉多余的
FOREIGN KEY关键字即可)
CREATE TABLE DRIVER ( DRIVER# INT NOT NULL PRIMARY KEY, DNAME VARCHAR(255), SALARY INT, CERT_DATE DATE, DEPOT# INT REFERENCES DEPOT(DEPOT#) );
- 方案2:表级约束定义(推荐使用,可以自定义约束名,后续排错、维护约束更方便)
CREATE TABLE DRIVER ( DRIVER# INT NOT NULL PRIMARY KEY, DNAME VARCHAR(255), SALARY INT, CERT_DATE DATE, DEPOT# INT, CONSTRAINT FK_DRIVER_DEPOT FOREIGN KEY (DEPOT#) REFERENCES DEPOT(DEPOT#) );
补充注意:执行DRIVER表的建表语句前,必须先创建好被引用的DEPOT表,且DEPOT表中的DEPOT#字段必须是主键或配置了唯一约束,否则外键约束会创建失败。另外Oracle官方推荐可变长度字符串类型使用
VARCHAR2而非VARCHAR,当前版本中VARCHAR是VARCHAR2的同义词,但后续版本可能调整其行为。
内容的提问来源于stack exchange,提问作者JAYMO
相关产品推荐
相关产品推荐

