2011-11-03 3 views
3

Oracle 9i에서 FK를 선언하는 데 문제가 있습니다. SO 및 일부 온라인 문서 (예 : http://www.techonthenet.com/oracle/foreign_keys/foreign_delete.php)에서 실제 운행없이 여러 가지 예를 살펴 보았습니다. 링크에서와 유사한 구문을 사용하면 동일한 오류가 발생합니다.Oracle의 외래 키 제약 문제

Error at Command Line:19 Column:4 
Error report: 
SQL Error: ORA-02253: constraint specification not allowed here 
02253. 00000 - "constraint specification not allowed here" 
*Cause: Constraint specification is not allowed here in the statement. 
*Action: Remove the constraint specification from the statement. 

SQL 자체의 발췌 내용은 다음과 같습니다. "선 (19)"는 CONSTRAINT 키워드없이 시도하는 것은 내가없는 볼 수없는 것있는 오른쪽 괄호에 대한 오류를 생성, 또는 CONSTRAINT

CREATE TABLE Flight (
flight_no varchar2(10) NOT NULL, 
airplane_id varchar2(20) NOT NULL 
    CONSTRAINT flight_airplane_id_fk FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id) 
    ON UPDATE RESTRICT ON DELETE RESTRICT, 
dept_date date NOT NULL, 
... 

로 시작하는 라인을 의미합니다.

추 신 : 내가 알고있는 UP UP RESTRICT는 Oracle의 기본 동작이지만 가능하면 명시 적으로 선호합니다.

답변

5

먼저 떨어져, 오라클, 더 ON UPDATE RESTRICT 또는 ON DELETE RESTRICT 옵션이 없습니다. 그것들은 다른 데이터베이스 엔진에서는 유효하지만, constraint syntax diagram에는 존재하지 않으며 유효하지 않은 것으로 보입니다. ON DELETE 조항이 있지만 유효한 옵션은 CASCADE 또는 SET NULL입니다. ON UPDATE 절이 없습니다.

우리가이 개 무효 조항을 constriant 정의하기 전에 airplane_id 정의의 마지막에 쉼표를 추가하고 제거 할 경우, DDL은

CREATE TABLE Flight (
    flight_no varchar2(10) NOT NULL, 
    airplane_id varchar2(20) NOT NULL, 
    CONSTRAINT flight_airplane_id_fk 
    FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id), 
    dept_date date NOT NULL, 
    <<more columns>> 
); 
+0

정말 고마워. 다른 문서 (예 : http://www.dba-oracle.com/bk_on_delete_restrict_on_delete_no_action_tips.htm)를 참조했지만 'RESTRICT'이 유효한 인수가 아닌 부분을 놓쳤습니다. 'NO ACTION '인 것처럼 보이지만, 나는 그것을 사용하려고 시도 할 때 여전히 오류가 발생합니다. 간단히 말해, 나는 아이가 존재할 경우 아무 것도 지울 수 없도록하고 싶다. 제약 조건의 일부로 명시 적으로 지정하지 않으면'ON DELETE CASCADE'가 기본 동작으로 간주됩니까? – elithrar

+1

@elithrar -'ON DELETE' 절을 지정하지 않으면, 디폴트는 자식 행이 존재하면 부모 행이 삭제되는 것을 방지합니다. 'ON DELETE SET NULL'은 부모가 삭제되어 고아를 만들면 자식의 부모 키를 'NULL'로 설정합니다. 'ON DELETE CASCADE'는 부모가 삭제되면 자식 레코드를 완전히 삭제합니다. 기본 동작을 얻는 유일한 방법은'ON DELETE' 절을 생략하는 것입니다.'ON DELETE NO ACTION '이 유효한 문법으로 보이지 않습니다. –

+0

이렇게 지워집니다. 필자는 Postgres에 익숙해 졌기 때문에 오라클의 특성 중 일부가 나를 얻습니다. 기본 동작은 내가 한 것입니다. – elithrar

0

는 말에 당신의 제약 조건을 넣어 :

CREATE TABLE Flight (
    flight_no varchar2(10) NOT NULL, 
    airplane_id varchar2(20) NOT NULL, 
    dept_date date NOT NULL, 
    CONSTRAINT flight_airplane_id_fk FOREIGN KEY (airplane_id) REFERENCES Airplane (airplane_id) ON UPDATE RESTRICT ON DELETE RESTRICT 
); 
+0

감사 유효해야합니다은 - 그 시도했지만 터무니없는 오류를 뱉어했다 나는/올바른 아래 핀 수 없음 : '명령 행에 오류 : (11) 칼럼 : 11 오류 보고서 : SQL 오류 : ORA-00905 : 누락 된 키워드 00905. 00000 - "실종 키워드" * 원인 : * 액션 : ' 다음 라인을 참조하십시오 : 'CONSTRAINT flight_airplane_id_fk FOREIGN KEY (airplane_id) 참조 비행기 (airplane_id) ON DELETE RESTRICT에서 업데이트 제한 ' – elithrar