创建vod_classification表触发ORA-00907错误:缺失右括号,求解决
解决ORA-00907: missing right parenthesis错误及表创建顺序问题
咱们一步一步来拆解你的问题:
首先,你遇到的ORA-00907: missing right parenthesis错误,根源是在创建vod_classification表时,最后一行的REFERENCES vod_film (dbClass)写法完全错误。外键约束必须通过CONSTRAINT关键字明确定义,而且更关键的是——你要引用的vod_film表还没创建呢! 数据库根本找不到这个表,同时语法上也不符合Oracle的外键定义规则。
其次,你的表创建逻辑搞反了:vod_film里的外键dbClass是引用vod_classification的主键dbClassId,所以应该先创建父表vod_classification,再创建子表vod_film,而不是反过来尝试让父表引用子表。
给你修正后的正确SQL:
第一步:创建父表vod_classification
CREATE TABLE vod_classification ( dbClassId CHAR(4), dbDescription VARCHAR2(90), CONSTRAINT vod_classification_PK PRIMARY KEY (dbClassId) );
这里去掉了错误的REFERENCES语句,因为这个表是被引用的一方,不需要引用其他未创建的表。
第二步:创建子表vod_film
CREATE TABLE vod_film ( dbFilmId NUMBER(4) NOT NULL, dbTitle VARCHAR2(50) NOT NULL, dbDirector_firstname VARCHAR2(10) NOT NULL, dbDirector_lastname VARCHAR2(10) NOT NULL, dbGenre VARCHAR2(10), dbUK_release_date DATE, dbFilename VARCHAR2 (15), dbRuntime NUMBER (10), dbClass CHAR(8), CONSTRAINT vod_film_PK PRIMARY KEY (dbFilmId), CONSTRAINT vod_film_class_FK FOREIGN KEY (dbClass) REFERENCES vod_classification (dbClassId) ON DELETE SET NULL );
这部分的外键约束是正确的,因为此时vod_classification已经存在,数据库可以找到对应的主键列。
另外提醒你一下:vod_film里的dbClass是CHAR(8),而父表的dbClassId是CHAR(4),长度不一致,这可能会导致后续数据插入或关联查询时出现问题,建议统一两者的长度哦。
内容的提问来源于stack exchange,提问作者Seba
相关产品推荐
相关产品推荐

