본문 바로가기

프로그래밍 강의 메모/갖고노는 MySQL 데이터베이스 by 얄코

MySQL 더 깊이 알아가기 > 기본키와 고유키, 그리고 외래키

https://inf.run/JvXX

 

갖고노는 MySQL 데이터베이스 by 얄코 - 인프런 | 강의

비전공자도 이해할 수 있는 MySQL! 빠른 설명으로 필수개념만 훑은 뒤 사이트의 예제들과 함께 MySQL을 ‘갖고 놀면서’ 손으로 익힐 수 있도록 만든 강좌입니다., - 강의 소개 | 인프런...

www.inflearn.com

 

1. 기본키(Primary Key) 더 알기

  • 중복되지 않는 고유값만 허용
  • NULL 값 허용하지 않음
  • 테이블당 하나의 기본키만 지정 가능
-- 기본키 넣는 방법 1
CREATE TABLE people (
  first_name CHAR(2) PRIMARY KEY,
  last_name CHAR(3),
  nickname VARCHAR(10)
);

-- 기본키 넣는 방법 2
CREATE TABLE people (
  first_name CHAR(2),
  last_name CHAR(3),
  nickname VARCHAR(10),
  PRIMARY KEY (first_name)
);

 

기본 키 변경하기

 

-- 기본키는 테이블당 하나만 있어서 따로 지정할 것이 없다.
ALTER TABLE people DROP PRIMARY KEY;

ALTER TABLE people ADD PRIMARY KEY (last_name);

 

다중 기본키

 

-- 기본키 하나에 컬럼이 여러 개 들어갈 수 있다.
-- 아래는 first_name과 last_name의 조합이 겹치지 않으면 행들이 구분된다.
-- 조합이 같다면 INSERT할 때 기본키 중복 에러가 뜬다.
CREATE TABLE people (
  first_name CHAR(2),
  last_name CHAR(3),
  nickname VARCHAR(10),
  PRIMARY KEY (first_name, last_name)
);

 

2. 고유키(Unique) 더 알기

  • 중복 제한, NULL 값 가능
-- 고유키 넣는 방법 1
CREATE TABLE people (
  person_id INT AUTO_INCREMENT PRIMARY KEY,
  first_name CHAR(2) UNIQUE,
  last_name CHAR(3)
);

-- 고유키 넣는 방법 2
CREATE TABLE people (
  person_id INT AUTO_INCREMENT PRIMARY KEY,
  first_name CHAR(2),
  last_name CHAR(3),
  UNIQUE (first_name)
);

-- 다중 고유키
CREATE TABLE people (
  person_id INT AUTO_INCREMENT PRIMARY KEY,
  first_name CHAR(2),
  last_name CHAR(3),
  UNIQUE (first_name, last_name)
);

 

3. 외래키

외래 키 추가하기

 

ALTER TABLE _자식테이블명
  ADD CONSTRAINT _제약명 
  FOREIGN KEY ( _자식테이블외래키 )
  REFERENCES 부모테이블명 ( _부모테이블기본키 )
  -- ON DELETE _삭제시제약 
  -- ON UPDATE _수정시제약

 

외래 키 삭제하기

 

ALTER TABLE _자식테이블명 DROP FOREIGN KEY _자식테이블외래키
  • 💡 외래키는 NULL값이거나 또는 부모 테이블의 기본 키값과 같아야 한다.

 

businesses에 sections에 대한 외래키를 설정한 뒤 실행.

-- 에러 발생
-- sections의 자식 테이블이라는 제약이 있어 테이블에 없는 fk_section_id 값을 INSERT 할 수 없다.
-- JOIN되어야할 테이블에 실수로 없는 값을 넣는 것을 방지해준다.
INSERT INTO businesses 
  (fk_section_id, business_name, status, can_takeout) 
  VALUES ('8', '섹션에없는식당', 'OPN', '1');

 

 

외래 키 제약

 

제약 설명 비고
NO ACTIONRESTRICT 자식 테이블에 해당 외래키가 있을 때 수정/삭제되지 않음  
CASCADE 자식 테이블의 해당 행도 수정/삭제  
SET NULL 자식 테이블의 외래키를 NULL로 자식 외래키가 NOT NULL일 시 설정 불가
SET DEFAULT 자식 테이블의 외래키를 기본값으로 InnoDB 엔진에서 사용 불가