기본키와 외래키에 대하여

2024. 12. 23. 23:56·Back End/DataBase

⭐️ 기본키

기본키 ( PRIMARY KEY )란 테이블에서각 행 ( ROW )를 식별하기 위해 사용될 컬럼에 부여하는 제약조건( 식별자 역할 ).

 

기본키는 또한 제약조건이 NOT NULL + UNIQUE 제약조건이 합쳐진 것이다.

 

EMPLOYEE 테이블의 일부

 

위 사진을 보면 EMP_ID 라는 고유한 식별자가 존재한다. 식별키는 예를 들어 회원번호 , 학번 , 군번 , 

부서코드 , 직급코드 , 주민등록번호 , 택배운송장 번호 , 예약번호 등등 여러가지가 될 수 있다 ‼️

 

그리고 테이블당 1개만 설정이 가능한다.

 

[코드]

CREATE TABLE MEM_PRI(
	MEM_NO NUMBER  CONSTRAINT MEMNO_PK PRIMARY KEY, 
	MEM_ID VARCHAR2(20)  NOT NULL,
	MEM_PWD VARCHAR2(20)  NOT NULL,
	MEM_NAME VARCHAR2(20)  NOT NULL,
	GENDER CHAR(3) CHECK(GENDER IN ('남','여')), 
	PHONE VARCHAR2(13),
	EMAIL VARCHAR2 (50),
	MEM_DATE DATE, 
	UNIQUE(MEM_ID) 
	-- PRIMARY KEY(MEM_NO)
);

 

이런식으로 PRIMARY KEY를 설정해줄 수 있다. 아래 주석은 테이블레벨 방식으로 추가한 것이다.

 


⭐️ 외래키

외래키 ( FOREIGN KEY ) 란 다른 테이블에 존재하는 값만 들어와야되는 특정 컬럼에 부여하는 제약조건.

 

-> 다른 테이블을 "참조" 한다고 표현한다.

-> 주로 FOREIGN KEY 제약조건으로 인해 테이블 관계가 형성된다.

 

-> 컬럼레벨 방식 : 컬럼명 자료형 REFERENCES 참조할 테이블명 [참조할 컬럼명]

 

-> 테이블레벨 방식 : FOREIGN KEY (컬럼명) REFERENCES 참조할 테이블명 [참조할 컬럼명]

 

참조할 컬럼명 생략시 참조할 테이블의 PRIMARY KEY로 지정된 컬럼이 매칭된다 ‼️

 

 

[코드]

 

CREATE TABLE MEM(
	MEM_NO NUMBER PRIMARY KEY, 
	MEM_ID VARCHAR2(20)  NOT NULL,
	MEM_PWD VARCHAR2(20)  NOT NULL,
	MEM_NAME VARCHAR2(20)  NOT NULL,
	GENDER CHAR(3) CHECK(GENDER IN ('남','여')), 
	PHONE VARCHAR2(13),
	EMAIL VARCHAR2 (50),
	MEM_DATE DATE,
	GRADE_ID NUMBER REFERENCES MEM_GRADE(GRADE_CODE)
);

 

위와같이 REFERENCES 참조할 테이블 (참조할 컬럼명) 형식으로 작성하여 FOREIGN KEY를 생성한다.

 

부모가 되는 MEM_GRADE 테이블의 GRADE_CODE를 참조한다 , 즉 MEM_GRADE 테이블이 부모가 되고,

MEM 테이블은 자식 테이블이 된다. 

 

-> MEM 테이블에서 GRADE_ID가 MEM_GRADE 테이블의 GRADE_CODE를 참조하기 때문에 , 

GRADE_ID 가 FOREIGN KEY가 된다 ‼️

 

[MEM_GRADE 테이블]

CREATE TABLE MEM_GRADE (
    GRADE_CODE NUMBER PRIMARY KEY,
    GRADE_NAME VARCHAR2(30) NOT NULL
);

INSERT INTO MEM_GRADE VALUES(10,'일반회원');
INSERT INTO MEM_GRADE VALUES(20,'우수회원');
INSERT INTO MEM_GRADE VALUES(30,'특별회원');
INSERT INTO MEM_GRADE VALUES(40,'VIP회원');

SELECT * FROM MEM_GRADE;

 

MEM_GRADE RESULT SET

 

MEMBER_GRADE에 GRADE_CODE 컬럼을 MEM 테이블에서 사용하는 중이다.

 

[MEM 테이블]

 

CREATE TABLE MEM(
	MEM_NO NUMBER PRIMARY KEY, 
	MEM_ID VARCHAR2(20)  NOT NULL,
	MEM_PWD VARCHAR2(20)  NOT NULL,
	MEM_NAME VARCHAR2(20)  NOT NULL,
	GENDER CHAR(3) CHECK(GENDER IN ('남','여')), 
	PHONE VARCHAR2(13),
	EMAIL VARCHAR2 (50),
	MEM_DATE DATE,
	GRADE_ID NUMBER REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE SET NULL
);


INSERT INTO MEM
VALUES(1,'USER1','PASS1','김진일', NULL,'010-1111-1111','AAA@AA.COM','24/12/23', NULL);

INSERT INTO MEM
VALUES(2,'USER2','PASS2','김진이', NULL,'010-1111-1111','AAA@AA.COM','24/12/23', 10);

INSERT INTO MEM
VALUES(3,'USER3','PASS3','김진삼', NULL,'010-1111-1111','AAA@AA.COM','24/12/23', 20);

INSERT INTO MEM
VALUES(4,'USER4','PASS4','김진사', NULL,'010-1111-1111','AAA@AA.COM','24/12/23', 30);

 

MEM 테이블 RESULT SET

 

이렇게 MEMGRADE 테이블에 있는 GRADE_CODE ( MEMGRADE 테이블의 PRIMARY KEY ) 를 

MEM 테이블에서 GRADE_ID 가 참조 하고 있다. 이게 바로 PRIMARY KEY이다.

 


 

기본키와 외래키를 사용해서 테이블간 연결인 JOIN을 사용할 수 있다는걸 꺠달았다.
SQL도 정말 하다보면 재미있는거 같다 ‼️

'Back End > DataBase' 카테고리의 다른 글

VIEW 생성시 함수식이나 산술연산식에 별칭을 부여해야 하는 이유  (0) 2024.12.28
데이터 조작어 (DML : DATE MANIPULATION LANGUAGE)에 대하여  (3) 2024.12.24
CREATE에 대하여  (2) 2024.12.23
Inline View (인라인뷰)에 대하여  (0) 2024.12.20
JOIN에 대하여  (4) 2024.12.18
'Back End/DataBase' 카테고리의 다른 글
  • VIEW 생성시 함수식이나 산술연산식에 별칭을 부여해야 하는 이유
  • 데이터 조작어 (DML : DATE MANIPULATION LANGUAGE)에 대하여
  • CREATE에 대하여
  • Inline View (인라인뷰)에 대하여
KoesJin
KoesJin
hEELo
  • KoesJin
    Seok DevLog
    KoesJin
  • 전체
    오늘
    어제
    • 분류 전체보기 (110)
      • Back End (31)
        • DataBase (15)
        • JAVA (12)
        • JDBC (4)
      • Front End (9)
        • HTML5 & CSS (3)
        • Java Script (6)
        • REACT (0)
      • Server (9)
        • JSP - TomCat - Servlet (7)
        • Spring Boot (2)
      • GitHub (1)
      • AWS (1)
      • IT 지식 (기술면접 대비) (20)
      • Weekly TIL (39)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    DDL
    exception
    GC
    css
    commit
    select
    weekly til - day 40
    weekly til - day 39
    weekly til - day 43
    순서에 대하여
    MVC 패턴
    weekly til - day 38
    order by
    dml
    INNER JOIN
    from
    View
    weekly til - day 41
    DAO
    where
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
KoesJin
기본키와 외래키에 대하여
상단으로

티스토리툴바