Foreign Key제약 설정시On delete cascade구문에 대해 헤깔리는 부분이 있어서 정리하였습니다. 테스트한 결과입니다. 1.테이블 생성 --부모 테이블 create table p1 ( no number(10) not null primary key, name varchar2(10) ); --자식:기본키 속성 create table p2 ( no number(10) not null primary key, name varchar2(10) ); --자식:일반속성 create table p3 ( id number(10) not null primary key, no number(10) ); 2.데이터Insert insert into P1 select level no ,'A' from dual connect by level <=3; commit; insert into P2 select level no ,'A' from dual connect by level <=3; commit; insert into P3 select level no , level from dual connect by level <=3; commit; 3.제약조건 설정 및 테스트 1) Case 1 alter table p2 add constraint fk_p2 foreign key(no) references p1(no); alter table p3 add constraint fk_p3 foreign key(no) references p1(no); -부모 테이블에서 데이터 삭제시Default로 생성되는 옵션"NO ACTION" -명시적으로 프로그램에서 자식 테이블의Row모두 삭제하고 부모 테이블의Row를 삭제해야됨 2) Case 2 alter table p2 add constraint fk_p2 foreign key(no) references p1(no)on delete cascade; alter table p3 add constraint fk_p3 foreign key(no) references p1(no)on delete cascade; -부모 테이블에서 데이터 삭제시 자식 테이블의Row는 자동으로 삭제됨 3) Case 3 alter table p2 add constraint fk_p2 foreign key(no) references p1(no)on delete set null; ---- PK는SET NULL사용불가 alter table p3 add constraint fk_p3 foreign key(no) references p1(no)on delete set null; -부모 테이블에서 데이터 삭제시 자식 테이블의Row는 자동으로NULL로 업데이트 함 -기본키 속성에는 위배됨.(Not Null제약에 의해서) *따라서Foreign Key제약 조건에 의해 데이터 무결성을 유지하기 위한 방법으로 -Foreign Key설정시On Delete구문을 추가하지 않으면Default옵션은 "No Action" .명시적으로 프로그램에서 자식 테이블의Row를 삭제한후 부모 테이블의Row를 삭제할수 있음 -DB에서 자동으로 데이터를 처리할 경우 기본키는"On Delete cascade",일반속성은"On Delete set null" 를 사용해야 됨. 4.결론
-부모 테이블의Row에 대해서는 자동으로 자식테이블 까지 삭제 가능(Delete or Set NULL) -업데이트는 프로그램을 통해서 명시적으로 구현해야됨 * Oracle은ON UPDATE구문 사용이 불가능함.트리거를 이용해서 구현해야 됨 * Syntax REFERENCES tableName [ ( simpleColumnName [ , simpleColumnName ]* ) ] [ ON DELETE { NO ACTION | RESTRICT | CASCADE | SET NULL } ] [ ON UPDATE { NO ACTION | RESTRICT } ] | [ ON UPDATE { NO ACTION | RESTRICT } ] [ ON DELETE { NO ACTION | RESTRICT | CASCADE | SET NULL } ]
Restrict : Disallows the update or deletion of referenced data. Set to null : When referenced data is updated or deleted, all associated dependent data is set to NULL. Set to default: When referenced data is updated or deleted, all associated dependent data is set to a default value. Cascade : When referenced data is updated, all associated dependent data is correspondingly updated. When a referenced row is deleted, all associated dependent rows are deleted. No action : Disallows the update or deletion of referenced data. This differs from RESTRICT in that it is checked at the end of the statement, or at the end of the transaction if the constraint is deferred. (Oracle Database uses No Action as its default action.)
풀이 : User_Table에서 성별(user_gender)이 남자인 이거나 보유금액(user_amount)이 5500 이상인 사람 중에 주소(user_addr)이NULL인 정보를 불러왔다. 하지만 해당 출력문에서 보면 알 수 있듯이 원하던 정보가 나오지 않았다. 이럴 경우 에는 ( ) 로 평가를 구분 해줄 수 있다.
풀이 : 기존에 원했던 정보 처럼User_Table에서 성별(user_gender)이 남자인 이거나 보유금액(user_amount)이 5500 이상인 사람 중에 주소(user_addr)이NULL인 정보를 불러왔다.
※ WHERE 절에서ANDOR같은 논리 연산자를 사용할때는 각 연산자를 모두 괄호로 묶어주는 것이 좋다 기본 평가 순서에 따라 제대로 해석되리라고 안심하지 말고, 직접 순서를 정해 의도대로 묶어주자. 괄호 사용에 따른 단점은 전혀 없으며, 오히려 조건을 보다 명확하게 이해하는데 도움이 된다.
DECLARE @SEARCH_TEXT NVARCHAR(MAX) = '검색텍스트';
SELECT B.NAME AS NAME -- 이름
, B.TYPE_DESC AS TYPE -- 타입 구분
, A.DEFINITION AS CONTENTS -- 내용
FROM SYS.SQL_MODULES A WITH (NOLOCK)
LEFT JOIN SYS.OBJECTS B WITH (NOLOCK) ON A.OBJECT_ID = B.OBJECT_ID
WHERE DEFINITION LIKE '%' + @SEARCH_TEXT + '%'
ORDER BY TYPE, NAME