2009-11-09 6 views
1

데이터베이스를 연구 중이며 현재 오브젝트 관계형 DB 프로젝트에서 작업 중이며 오브젝트 테이블에서 가능한 제한 조건의 수에 대해 작은 문제가 발생했습니다. 참고로 헥터 가르시아 - 몰리나로 (그리고 다른 저자)와 같은 일반적인 SQL 예있다 "완전한 도서를 데이터베이스 시스템을": 내가 사용유형 참조 범위

CREATE TYPE StarType AS (
    name CHAR(30), 
    address AddressType, 
    bestMovie REF(MovieType) SCOPE Movies 
); 

지금, 나는 비슷한의 종류가 내 프로젝트에서 형식으로 다른 형식에 대한 참조도 사용하지만 참조를 배치하는 절은 오라클에 SCOPE를 포함하지 않습니다 (적어도 문서에서는 찾지 못했지만 오류가 출력됩니다) . 그래서 다음과 같은 형식이 있습니다 :

CREATE OR REPLACE TYPE "ApplicationType" AS OBJECT (
    "person" REF "PersonType", 
    "competition" REF "CompetitionType", 
    "dateApplied" DATE 
); 
/

... 작동하는 .... 나는 REF 열을 제한하고자 할 때, 나는 그래서 하나를 제한 할 수 있습니다 모두 REF 컬럼에 제약을 줄 수있는 방법이

CREATE TABLE "Applications" OF "ApplicationType" (
    "person" SCOPE IS "People" /* or "competition" SCOPE IS "Competitions" */ 
) 
OBJECT IDENTIFIER IS SYSTEM GENERATED; 

있습니까?

+0

둘 다 시도하면 어떻게됩니까? 어떤 오류 메시지가 나타 납니까? –

+0

"ORA-00904 : : invalid identifier"오류가 발생합니다. 그러나 이러한 제약 조건 중 하나만 사용하면 표가 정상적으로 생성됩니다. –

답변

4

이 잘 작동합니다 :

CREATE TABLE Applications OF ApplicationType (
    person SCOPE IS People, 
    competition SCOPE IS Competitions 
) 
OBJECT IDENTIFIER IS SYSTEM GENERATED; 

어쩌면 당신이 (당신의 코멘트에서 볼 수 있듯이) 제약 조건을 분리하는 대신 ,or를 사용하여 테이블을 생성했습니다.

제약 조건을 쉽게 테스트 할 수 있습니다. 대해 참조 값이 지정된 범위 테이블에없는 때문에 경기가 아닌 더미 Competitions2 인 (AN ORA-22889에서

INSERT INTO People VALUES('p1'); 
INSERT INTO People2 VALUES('p21'); 
INSERT INTO Competitions VALUES('c1'); 
INSERT INTO Competitions2 VALUES('c21'); 
COMMIT; 
INSERT INTO Applications 
VALUES 
(
    (SELECT REF(p) FROM People p WHERE person = 'p1'), 
    (SELECT REF(c) FROM Competitions2 c WHERE competition = 'c21'), 
    SYSDATE 
); 

결과 : 다음

CREATE TABLE People2 OF PersonType 
OBJECT IDENTIFIER IS SYSTEM GENERATED; 

CREATE TABLE Competitions2 OF CompetitionType 
OBJECT IDENTIFIER IS SYSTEM GENERATED; 

: 그냥이 두 개의 추가 더미 테이블을 생성). 사람 대신 People2를 사용하여 유사하게 테스트 할 수 있습니다.

+0

답변을 주셔서 감사합니다, Marius. 나는 그 사용자가 "또는"그 오류가 생겼을 때 내 코드가 너와 똑같이 보였다. (나는 테이블, 타입, 속성 이름이 ""으로 둘러싸여 있었다. 나는 다시 시도하고, 모든 유형과 테이블을 다시 만들었지 만, ""하지 않고도 여전히 나를 위해 작동하지 않습니다 (아무 관계가 없어야 함). 제 코드는 당신 것처럼 보입니다. –

+0

귀하의 질문을 편집하여 사용하는 전체 SQL (CREATE TYPE/TABLE, INSERT 등)을 게시하십시오. –

+0

방금 ​​내 코드를 다시 검토했는데 CREATE TABLE 문에 오타가 잘못 입력되어 SQL 오류가 발생한 마지막 제약 조건의 끝에 혼수 상태가있었습니다. 이제 작동합니다. :) 제약 조건 테스트에 대한 도움과 제안에 감사드립니다! –