H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • 외래키 제약조건
  • 예시 : 두 테이블 간의 연결
  • 게시글 테이블(board)
  • 댓글 테이블(reply) - 외래키 미설정
  • 댓글 테이블(reply) - 외래키 설정
  • 외래키 연결 조건
  • 외래키 연결 조건 미설정
  • 외래키 CASCADE 설정
  • 외래키 SET NULL 설정
  • 예시 : 한 테이블 사이의 연결
  1. Database
  2. Oracle
  3. SQL
  4. 사용자 명령
  5. 테이블 관리

외래키 제약조건

외래키 제약조건

외래키란 다른 테이블 또는 데이터를 참조할 수 있도록 만들어진 제약조건을 말한다. 외래키를 사용하면 데이터 사이에 더 강한 연결을 구성할 수 있다. 크게 다른 테이블을 참조 하는 경우와 같은 테이블을 참조 하는 경우가 있다.

예시 : 두 테이블 간의 연결

게시글 정보와 댓글 정보를 관리하는 시스템을 구축하고 싶다고 가정하고 분석을 해보도록 한다. 두 개체는 다음과 같은 관계를 가진다.

게시글 한 개에 댓글 여러 개가 작성될 수 있으며, 게시글이 없이는 댓글이 작성될 수 없다.

이 경우 게시글과 댓글은 1:n 관계를 가진다고 표현한다. 하지만 게시글과 댓글이 같은 테이블에 저장될 수는 없기 때문에 나누어 저장하되 연결되어 있도록 구성하는 것이 필요하다.

게시글 테이블(board)

게시글 테이블은 특별한 항목 없이 번호, 제목, 내용 만으로 구성한다.

CREATE TABLE board(
board_no NUMBER PRIMARY KEY,
board_title varchar2(300) NOT NULL,
board_content varchar2(4000) NOT NULL
);

INSERT INTO board VALUES(1, '공지사항', '안내드립니다');
INSERT INTO board VALUES(2, '테스트', '테스트 글입니다');
INSERT INTO board VALUES(3, '안내', '신규 기능 안내입니다');

BOARD_NO

BOARD_TITLE

BOARD_CONTENT

1

공지사항

안내드립니다

2

테스트

테스트 글입니다

3

안내

신규 기능 안내입니다

댓글 테이블(reply) - 외래키 미설정

댓글 테이블은 게시글이 몇 개일지 모르기 때문에 하나로 구성하는 대신 게시글 번호를 보관하도록 구성한다.

CREATE TABLE reply(
reply_no NUMBER PRIMARY KEY,
reply_content varchar2(1000) NOT NULL
board NUMBER NOT NULL
);

INSERT INTO reply VALUES(101, '확인했습니다', 1);
INSERT INTO reply VALUES(102, '넵', 1);
INSERT INTO reply VALUES(103, '기대됩니다~', 3);
INSERT INTO reply VALUES(104, '오래 기다렸어요', 3);
INSERT INTO reply VALUES(105, '아싸!', 3);
INSERT INTO reply VALUES(106, '유령댓글', 5);

현재는 외래키를 설정하지 않은 상황이며, 저장까지 마친 뒤의 상황은 다음과 같다.

REPLY_NO

REPLY_CONTENT

BOARD

101

확인했습니다

1

102

넵

1

103

기대됩니다~

3

104

오래 기다렸어요

3

105

아싸!

3

106

유령댓글

5

문제점

두 테이블에 저장된 데이터를 연결해보면 다음과 같다.

  1. 5번 게시글은 존재하지 않는데 이를 참고하는 댓글이 존재하게 되므로 구조 상 올바른 데이터가 저장되었다고 보기 어려운 상황이다.

  2. 게시글이 삭제되어도 댓글은 남아있게 되므로 데이터 관리가 어려워지며 추가 처리가 필요하다.

위의 문제점들을 해결하기 위해서 외래키(Foreign key)라는 것이 필요하다.

댓글 테이블(reply) - 외래키 설정

댓글 테이블에 외래키를 설정하여 게시글 테이블과 강한 연결이 되도록 테이블을 구성다.

CREATE TABLE reply(
reply_no NUMBER PRIMARY KEY,
reply_content varchar2(1000) NOT NULL
board REFERENCES board(board_no)
);

REFERENCES boadr(board_no) 를 추가하면 board 테이블의 board_no 항목을 참조하겠다는 뜻이 되어 종속 관계가 성립한다. 따라서 참조하는 항목에 존재하지 않는 데이터는 설정할 수 없다. 즉, 다음 코드는 외래키를 설정한 시점부터 등록이 불가다.

INSERT INTO reply VALUES(106, '유령댓글', 5);

외래키를 설정함으로 인하여 1번 문제점을 해결하였다.

외래키 연결 조건

외래키는 생성 시 다양한 연결 조건을 설정할 수 있다. 이는 2번 문제점을 해결하는 것에 도움을 준다.

  • ON DELETE SET NULL

  • ON DELETE CASCADE

  • ON DELETE CASCADE CONSTRIANT

외래키 연결 조건 미설정

다음과 같이 작성할 경우 board 테이블 데이터 삭제 시 연결된 하위 데이터가 존재할 경우 삭제가 불가능하다.

board REFERENCES board(board_no)

외래키 CASCADE 설정

다음과 같이 작성할 경우 board테이블 데이터 삭제 시 연결된 하위 데이터가 삭제된니다.

board REFERENCES board(board_no) ON DELETE CASECADE

외래키 SET NULL 설정

다음과 같이 작성할 경우 board테이블 데이터 삭제 시 연결된 하위 데이터의 항목이 null로 설정된다.

board REFERENCES board(board_no) ON DELETE SET NULL

상황에 따라 알맞은 연결 조건을 사용하는 것이 중요하다.

회원과 댓글이 있을 때, ON DELETE SET NULL 조건을 이용하여 회원이 탈퇴해도 댓글이 남아있도록 설정할 수 있다.

예시 : 한 테이블 사이의 연결

직원 테이블을 만든다고 할 때, 외래키를 이용하여 직원 간의 상하관계를 설정할 수 있다.

CREATE TABLE employee(
emp_no NUMBER PRIMARY KEY,
emp_name VARCHAR2(21) NOT NULL,
emp_rank VARCHAR2(12) NOT NULL CHECK(emp_rank IN ('사장','임원','부장','차장','과장','대리','사원','인턴')),
senior_no REFERENCES employee(emp_no) ON DELETE SET NULL
);

INSERT INTO employee VALUES(1, '민준', '사장', null);
INSERT INTO employee VALUES(2, '서준', '임원', 1);
INSERT INTO employee VALUES(3, '서연', '임원', 1);
INSERT INTO employee VALUES(4, '지우', '부장', 2);
INSERT INTO employee VALUES(5, '민서', '부장', 2);
INSERT INTO employee VALUES(6, '도윤', '과장', 3);
INSERT INTO employee VALUES(7, '지호', '대리', 5);
INSERT INTO employee VALUES(8, '채원', '대리', 6);
INSERT INTO employee VALUES(9, '윤서', '사원', 8);
INSERT INTO employee VALUES(10, '수아', '사원', 8);

데이터를 구조화하면 다음과 같다.

EMP_NO

EMP_NAME

EMP_RANK

SENIOR_NO

1

민준

사장

-

2

서준

임원

1

3

서연

임원

1

4

지우

부장

2

5

민서

부장

2

6

도윤

과장

3

7

지호

대리

5

8

채원

대리

6

9

윤서

사원

8

10

수아

사원

8

게시글의 경우도 이러한 계층 구조를 이용하여 구성될 수 있다. 이러한 구조를 계층형 구조라고 다.

Previous테이블 항목 제약 조건Next데이터 유형

Last updated 3 years ago