0

我试图在我的一张桌子上添加一个约束,以确保我的工人维护一个工作站,当且仅当该工作站处于该工人当前受雇的状态时。但是,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. 

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

4

1 回答 1

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) ;

然后我们创建一个有很多约束的相交表:)。(显然,我在这里猜测数据类型以及列名。)

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 密钥确保每个站点只有一个维护者。我假设一个作品可以维护一个以上的站点,

我们需要两个表上的唯一键,以便外键可以引用状态以及实际的主键。这是一个闪避,但它确实确保交集表上的状态列与父表上的状态列匹配。


您发布的 CHECK 中的实际表格很混乱。没有任何东西将 WORKER 和 STATE 加入到 STATION,所以我猜测这些表可能是如何相关的。如果我的猜测与您的实际模型不符,请不要抱怨:相反,修改您的问题以提供准确和充分的细节。

于 2013-02-24T13:45:18.993 回答