Oracle 12c创建含自增主键与外键表时遇ORA-00907错误求助
解决Oracle创建带自增主键和外键表的ORA-00907错误
嘿,我来帮你搞定这个Oracle建表的问题~你遇到的ORA-00907: missing right parenthesis错误,其实是因为在CREATE TABLE语句里定义外键时混淆了列级约束和表级约束的语法,我给你拆解一下正确的写法:
错误原因分析
你之前的两种写法都有语法问题:
- 第一种写法:在列定义后直接写
foreign key references...,列级约束不需要foreign key关键字,Oracle会默认约束针对当前列; - 第二种写法:在列定义后写
foreign key (question_id) references...,这是表级约束的语法,不能放在列的定义后面,必须单独放在所有列定义之后。
正确写法一:列级约束定义外键
这种方式适合单列外键,写法简洁,不需要额外指定约束名(Oracle会自动生成):
create table answers ( id number generated by default on null as identity primary key , question_id number not null references questions(id) , user_id number not null references users(id) , answer varchar(1000) , post_date date );
这里直接在question_id和user_id列的定义后加references 父表(主键列),就完成了外键约束的定义,不需要额外的foreign key关键字。
正确写法二:表级约束定义外键
这种方式更灵活,适合多列组合外键,而且可以给约束起自定义名称,方便后续维护(比如修改、删除约束):
create table answers ( id number generated by default on null as identity primary key , question_id number not null , user_id number not null , answer varchar(1000) , post_date date, -- 给外键约束起自定义名称 constraint fk_answers_question foreign key (question_id) references questions(id), constraint fk_answers_user foreign key (user_id) references users(id) );
注意这里的外键约束是放在所有列定义之后,用逗号分隔,并且明确指定foreign key (列名)来关联父表。
总结
两种写法都能一次性创建带外键的表,不需要分两步用ALTER语句添加约束。你之前的报错就是因为语法混用,选上面任意一种写法都能解决问题~
内容的提问来源于stack exchange,提问作者AHmad
相关产品推荐
相关产品推荐

