2010-04-11 8 views
6

나는 여러 테이블오라클 데이터베이스는 여러 테이블에 CHECK를 적용

CREATE TABLE RollingStocks ( 
    Id NUMBER, 
    Name Varchar2(80) NOT NULL,   
    RollingStockCategoryId NUMBER NOT NULL,    
    CONSTRAINT Pk_RollingStocks Primary Key (Id), 
    CONSTRAINT Check_RollingStocks_CategoryId 
    CHECK ((RollingStockCategoryId IN (SELECT Id FROM FreightWagonTypes)) 
     OR 
     (RollingStockCategoryId IN (SELECT Id FROM LocomotiveClasses)))  
); 

에 오라클 데이터베이스에 CHECK 제약 조건을 적용하기 위해 노력하고 ... 그러나 나는 다음과 같은 오류 얻을 :

*Cause: Subquery is not allowed here in the statement. *Action: Remove the subquery from the statement.

수를 문제가 무엇인지, 같은 결과를 얻는 방법을 이해하는 데 도움이됩니까?

답변

2

오라클에서는 제한 조건이 매우 제한적입니다. 제안한 것처럼 확인하려면 PL/SQL trigger을 구현해야합니다.

제발 트리거를 피하는 것이 좋습니다. 데이터베이스를 수정하고 검사를 포함하는 저장 프로 시저를 구현하십시오. 저장 프로 시저는 구현하기가 약간 어렵지만 유지 관리가 더 쉽습니다. 그러나 프론트 엔드를 직접 테이블 액세스에서 스토어드 프로 시저 액세스로 변경하면 결국 장기간에 여러 번 지불하게됩니다.

2

한 테이블에 삽입 된 값이 다른 테이블에 존재하는지, 즉 외래 키를 적용하는지 확인하십시오. 그래서는 다음과 같습니다 당신이 테이블을 참조하는 외래 키를 적용 할 것을 제외하고

CREATE TABLE RollingStocks ( 
... 

    CONSTRAINT Pk_RollingStocks Primary Key (Id), 
    CONSTRAINT RollingStocks_CategoryId_FK (RollingStockCategoryId) 
    REFERENCES FreightWagonTypes (ID)  
); 

합니다. 이것은 할 수 없습니다.

몇 가지 옵션이 있습니다. 하나는 FreightWagonTypes와 LocomotiveClasses를 단일 테이블로 병합하는 것입니다. 응용 프로그램의 다른 부분에 대해 별도의 테이블이 필요하면 외래 키를 적용 할 목적으로 구체화 된보기를 작성할 수 있습니다. 구체화 된 뷰는 테이블과 유사하며 외부 키가 참조 할 수 있습니다. 두 테이블의 키 값이 충돌하면이 옵션이 작동하지 않습니다.

또 다른 옵션은 롤링 스톡이 두 개의 테이블로 나눠 져야 할 필요가 있음을 암시하는 두 개의 후보 참조 테이블이 있다는 것을 인식하는 것입니다. 수퍼 유형과 두 가지 하위 유형 테이블, RollingStock 및 FreightWagons, 기관차 .

그런데 PassengerCoaches, Guardswagons 및 RestaurantCars는 어떻습니까?

+2

또 다른 대안은 RollingStockCategoryId를 두 개의 null 가능 열로 나누는 것입니다. 하나는 FK에서 FreightWagonTypes로, 다른 하나는 LocomotiveClasses에서 FK로 분리하는 것입니다. check 제약 조건을 추가하여 하나의 행에 대해 null이 아니어야한다고 말할 수 있습니다. –

0

오라클은 이러한 복잡한 검사 제약 조건을 지원하지 않습니다.

이 경우 데이터 모델을 약간 변경하는 것이 가장 좋습니다. FreightWagonTypesLocomotiveClasses 이상의 부모 테이블을 추가하면 두 테이블의 모든 ID가 유지됩니다. 그런 식으로 하나의 테이블에 FK를 추가 할 수 있습니다.

관련 문제