我正在尝试在我的一个表格上添加一个约束,以确保我的工作人员维持一个工作站,当且仅当该工作站处于当前工作人员的状态时。但是,似乎Oracle不喜欢限制内的子查询。
我记得我在回来的时候认为sqlplus不喜欢跨表检查,当我这样做时:
ALTER TABLE STATION ADD CONSTRAINT Check_Worker CHECK (Maintainer IN (
SELECT *
FROM
STATION s,
FOREST f,
COVERAGE c,
STATE st,
WORKER w
WHERE
s.x BETWEEN f.MBR_XMin AND f.MBR_XMax AND
s.y BETWEEN f.MBR_YMin AND f.MBR_YMax AND
f.Forest_Id = c.Forest_Id AND
st.State = w.employing_state
)
);
它对我大喊:
'Question 3'
SELECT *
*
ERROR at line 2:
ORA-02251: subquery not allowed here.
那么,我有什么选择可以轻松解决这个问题吗?可能有多重约束?
答案 0 :(得分:4)
解决此问题的一种方法是使用数据模型。使用交叉表加入WORKER和STATION。
技巧是创建唯一的复合键,将STATE添加到WORKER和STATION的实际主键。
所以,像这样:
alter table WORKER add constraint wrk_state_uk unique (worker_id, employing_state) ;
alter table STATION add constraint stn_state_uk unique (station_id, state) ;
然后我们用 lot 约束创建一个交叉表:)。 (显然我在这里猜测数据类型,列名也是。)
create table station_maintainer (
station_id number not null
, station_state number not null
, worker_id number not null
, employing_state number not null
, constraint stn_mnt_pk primary key (station_id, worker_id)
, constraint stn_mnt_uk unique (station_id )
, constraint stn_mnt_stn_fk foreign key (station_id)
references station (station_id)
, constraint stn_mnt_wrk_fk foreign key (worker_id)
references worker (worker_id)
, constraint stn_mnt_state_ck check (station_state = employing_state)
UNIQUE键确保每个站只有一个维护者。我预测一项工作可以维持多个工作站,
我们需要两个表上的唯一键,以便外键可以引用状态以及实际的主键。这是一个闪避但它确实确保交叉表上的STATE列匹配父节点上的STATE列。
您发布的CHECK中的实际表格很混乱。没有什么可以将WORKER和STATE加入STATION,所以我猜测了表格是如何相关的。如果我的猜测与您的实际型号不符,请不要抱怨:相反,请修改您的问题以提供准确且充分的详细信息。