Oracle中如何在嵌套表定义外键?代码报‘missing keyword’错误求解
搞定Oracle嵌套表外键+修复REF语法错误
嘿,先帮你解决眼前的「missing keyword」错误,再一步步实现嵌套表的外键引用哈!
一、先修那个语法错误
你标记的Doctor REF Doctor_type行报错,大概率是下面俩原因:
- 属性末尾多打了逗号:如果这是
HospitalVisits_type的最后一个属性,绝对不能加逗号!Oracle解析器看到逗号就会等着下一个属性,结果直接碰到了),就会喊“缺关键字”。修正后的代码应该是这样:
CREATE TYPE Doctor_type AS OBJECT( regNo char(100), name varchar2(50), specialization varchar2(50) ); / CREATE TYPE HospitalVisits_type AS OBJECT( visitNo char(10), hosCharge varchar2(10), -- 提个小建议:存费用别用char,用varchar2或者number更靠谱,避免自动补空格坑你 makedate date, Doctor REF Doctor_type -- 这里是最后一个属性,别加逗号! ) NOT FINAL; /
- 先确认Doctor_type创建成功:要是第一个
Doctor_type的创建语句没跑成功(比如权限不够、语法错了),后面引用它肯定出问题。先单独执行第一个类型的创建语句,确保没报错再往下走。
二、给嵌套表加外键引用
Oracle里嵌套表的外键不能像普通关系表那样直接写FOREIGN KEY,得结合对象表和SCOPE FOR子句来实现,步骤给你列清楚:
- 先建Doctor的对象表(相当于主表)
基于你定义的Doctor_type建个对象表,顺便把regNo设为主键,保证每个医生的标识唯一:
CREATE TABLE Doctors OF Doctor_type ( regNo PRIMARY KEY ); /
- 定义嵌套表类型
假设你的Make_type是要装一堆就诊记录的,先把嵌套表的类型定义好:
CREATE TYPE HospitalVisits_tab AS TABLE OF HospitalVisits_type; /
- 创建包含嵌套表的对象类型
把嵌套表作为属性放进Make_type里:
CREATE TYPE Make_type AS OBJECT( patientId char(10), visits HospitalVisits_tab -- 这个就是存就诊记录的嵌套表 ); /
- 建主表并加约束(核心步骤!)
创建Makes表的时候,用SCOPE FOR把嵌套表里的Doctor引用牢牢绑在Doctors表上,这就相当于外键,保证只能引用真实存在的医生:
CREATE TABLE Makes OF Make_type ( patientId PRIMARY KEY ) NESTED TABLE visits STORE AS visits_nt ( -- 约束嵌套表里的Doctor只能指向Doctors表的有效对象 SCOPE FOR (Doctor) IS Doctors ); /
这样一来,嵌套表里的就诊记录就只能关联到Doctors表中存在的医生,不会出现无效引用的情况,完美实现外键的作用~
内容的提问来源于stack exchange,提问作者user8785832
相关产品推荐
相关产品推荐

