我正尝试在我的一个表上添加一个约束,以确保我的工人维护一个工作站时,且仅当该工作站处于工人当前受雇的状态时。但是,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. 那么,我有没有什么办法可以轻松解决这个问题呢?可能有多个约束?
发布于 2013-02-24 21:45:19
解决这个问题的一种方法是使用数据模型。使用交叉表连接工人和桩号。
诀窍是创建唯一的组合键,它将状态添加到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) ;然后我们创建一个具有许多约束的交叉表:)。(显然,我正在猜测这里的数据类型,以及列名。)
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);
唯一的密钥确保每个工作站只有一个维护者。我猜想一部作品可以维持不止一个工作站,
我们需要两个表上的唯一键,以便外键可以引用状态以及实际的主键。这是一个回避,但它确实确保交叉表上的STATE列与父表上的STATE列相匹配。
您张贴的支票中的实际表格是混乱的。没有连接WORKER和状态到工作站的任何东西,soI已经猜测了表可能是如何相关的。如果我的猜测与您的实际模型不符,请不要抱怨:相反,请修改您的问题以提供准确和足够的详细信息。
https://stackoverflow.com/questions/15048108
复制相似问题