YJ의 새벽

SQL 외래키(FK) 본문

SelfStudy/Oracle (SQL)

SQL 외래키(FK)

YJDawn 2023. 1. 26. 20:46
  • 외래키 ( FK . Foreign key )

--두개의 테이블을 연결해주는 다리 역할.

--외래키는 새롭게 추가되는 행에서 외래키에 해당하는 값이

  외래키가 참조하는 테이블이 존재하는지를 체크 .

--참조하는 테이블에 무결성을 높여주는 역할.

--형식
CONSTRAINT [제약조건이름] FOREIGN KEY ([컬럼이름])
REFERENCES [참조테이블이름] ([참조컬럼이름])
[ON DELETE CASCADE | ON DELETE SET NULL] ;

**ON DELETE CASCADE

 --참조되는 부모 테이블 행에 대한 DELETE 를 허용.

      즉, 참조되는 부모 테이블 값이 삭제되면 연쇄적으로 자식 테이블 값 역시 삭제.

           목적 : 부모 테이블 값을 삭제할때 기본적으로 오류 발생.

**ON DELETE SET NULL

--참조되는 부모 테이블 행에 대한 DELETE 를 허용.

--부모 테이블 값이 삭제되면 해당 참조하는 자식 테이블의 값들이 NULL 로 설정.

 

***일반적으로 ON DELETE CASCADE 를 많이 사용한다.

 

-- 테이블과 제약조건까지 제거
DROP TABLE 테이블명 CASCADE CONSTRAINTS ;

--실습 DROP문
DROP TABLE TESTFK3 CASCADE CONSTRAINTS;
DROP TABLE TESTFK4 CASCADE CONSTRAINTS;

 

EX ))) ON DELETE CASCADE 예제 .

--기본키 갖는 TESTFK3 테이블 생성
CREATE TABLE TESTFK3 (
PK_COLUMN1 NVARCHAR2(100),
CONSTRAINT TESTFK3_PK PRIMARY KEY (PK_COLUMN1)
);

--외래키 갖는 TESTFK4 테이블 생성
CREATE TABLE TESTFK4 (
PK_COLUMN1 NVARCHAR2(100),
COLUMN2 NVARCHAR2(100),
CONSTRAINT TESTFK4_FK_PK_COLUMN1 FOREIGN KEY(PK_COLUMN1) REFERENCES TESTFK3(PK_COLUMN1)
ON DELETE CASCADE
);

--TESTFK3 테이블에 데이터 입력
INSERT INTO TESTFK3 VALUES( 'MENU1' );
INSERT INTO TESTFK3 VALUES( 'MENU2' );
--TESTFK4 테이블에 데이터 입력
INSERT INTO TESTFK4 VALUES('MENU1','김밥');
INSERT INTO TESTFK4 VALUES('MENU1','튀김');
INSERT INTO TESTFK4 VALUES('MENU2','오뎅');
INSERT INTO TESTFK4 VALUES('MENU2','라면');
COMMIT;

--부모테이블 TESTFK3 에서 PK_COLUMN1 값이 'MENU1'인 행 찾아서 지우기
DELETE FROM TESTFK3 WHERE PK_COLUMN1 = 'MENU1';
COMMIT;

--부모테이블, 자식테이블 모두 MENU1 행 삭제.

DELETE 전
DELETE 후

 

EX ))) ON DELETE SET NULL 예제 .

--기본키 갖는 TESTFK3 , 각 테이블 데이터들 동일합니다.

--외래키 갖는 TESTFK4 테이블 생성할때
-- SET NULL로 수정한후 데이터확인

CREATE TABLE TESTFK4 (
PK_COLUMN1 NVARCHAR2(100),
COLUMN2 NVARCHAR2(100),
CONSTRAINT TESTFK4_FK_PK_COLUMN1 FOREIGN KEY(PK_COLUMN1) REFERENCES TESTFK3(PK_COLUMN1)
ON DELETE SET NULL
);

--부모테이블 TESTFK3 에서 PK_COLUMN1 값이 'MENU1'인 행 찾아서 지우기
DELETE FROM TESTFK3 WHERE PK_COLUMN1 = 'MENU1';
COMMIT;

--부모테이블은 MENU1 행 자체가 없어짐.

--자식테이블은 행이 존재하고, 외래키로 설정된 값이 NULL 로 변환.

DELETE 전
DELETE 후

 

 

 

 

 

 

 

 

 

 

 

 

'SelfStudy > Oracle (SQL)' 카테고리의 다른 글

SQL 기초/쿼리문  (0) 2023.02.01
SQL응용 JDBC (Connection pool)  (0) 2023.01.26
SQL응용 JDBC (뷰)  (0) 2023.01.26
SQL응용 JDBC (SELECT, INSERT, UPDATE)  (2) 2023.01.26
SQL응용 JDBC (인덱스),throws  (0) 2023.01.25
Comments