检查中的子查询“此处不允许”

时间:2013-02-24 02:38:50

标签: oracle subquery constraints assertions data-integrity

我正在尝试在我的一个表格上添加一个约束,以确保我的工作人员维持一个工作站,当且仅当该工作站处于当前工作人员的状态时。但是,似乎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. 

那么,我有什么选择可以轻松解决这个问题吗?可能有多重约束?

1 个答案:

答案 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,所以我猜测了表格是如何相关的。如果我的猜测与您的实际型号不符,请不要抱怨:相反,请修改您的问题以提供准确且充分的详细信息。