[SQL] CONSTRAINT, PRIMARY KEY, FOREIGN KEY

박미영·2023년 4월 26일
0

📌Constraint(제약조건)

데이터의 무결성을 지키기 위해 제한한(된) 규칙

MySQL에서 사용할 수 있는 제약 조건
1. NOT NULL - 해당 필드는 NULL값 저장 불가(무조건 데이터를 가지고 있어야함)
2. UNIQUE - 해당 필드는 서로 다른 값을 가져야함(중복된 값 저장 금지)
3. PRIMARY KEY(아래 설명)
4. FOREIGN KEY(아래 설명)
5. DEFAULT - 해당 필드의 기본값을 설정 할 수 있게 해준다.


📌PRIMARY KEY(기본키)

  • 테이블의 각 레코드를 식별(데이터를 쉽고 빠르게 찾도록 도와주는 역할)
  • 중복되지 않은 고유값(unique)을 포함
  • NOT NULL
  • 테이블 당 하나의 기본키를 가짐

create table table_name
(
	column1 datatype NOT NULL,
	column2 datatype NOT NULL,
    ...
    CONSTRAINT constraint_name
    PRIMARY KEY (column1, column2, ...)
);



📍Primary Key 생성 - 테이블 생성시

- 단일 컬럼 primary key 생성

create table person
(
	pid int NOT NULL,
	name varchar(16),
	age int,
    sex char,
    primary key (pid)
);



- 다중 컬럼 primary key 생성

create table animal
(
	name varchar(16) NOT NULL,
    type varchar(16) NOT NULL,
    age int,
    primary key (name, type)
);



📍Primary Key 삭제

ALTER TABLE tablename
DROP PRIMARY KEY;



- 단일 컬럼 primary key 삭제

ALTER TABLE PERSON
DROP PRIMARY KEY;



- 다중 컬럼 primary key 삭제

단일과 방법은 동일하다.

ALTER TABLE animal
DROP primary key;



📍Primary Key 생성 - 테이블 생성 이후

ALTER TABLE table_name
add primary key (column1, column2, ...);



- 단일 컬럼 primary key 생성

ALTER TABLE person
add primary key (pid);



- 다중 컬럼 primary key 생성

ALTER TABLE animal
add constraint PK_animal
PRIMARY KEY (name, type);





📌 FOREIGN KEY (외래키)

  • 한 테이블을 다른 테이블과 연결해주는 역할
  • 외래 키가 설정된 테이블에 레코드를 입력하는 기준이 되는 테이블의 내용을 참조해서 레코드가 입력된다.
  • 참조되는 테이블의 필드는 반드시 UNIQUE OR PRIMARY KEY가 설정되어 있어야 함

📍COSNTRAINT 생성 문법 - 테이블 생성시

create table table_name
(
	column1 datatype NOT NULL,
	column2 datatype NOT NULL,
    column3 datatype,
    column4 datatype,
    ...
    CONSTRAINT constraint_name
    PRIMARY KEY (column1, column2, ...),
    CONSTRAINT constraint_name
    FOREIGN KEY (column3, column4, ...) REFERNCES REF_tablename(REF_column)
);



📍COSNTRAINT 확인 문법

자동 생성된 CONSTRAINT 를 확인하는 방법

SHOW CREATE TABLE tablename;



📍FOREIGN KEY 삭제 문법

ALTER TABLE tablename
DROP FOREIGN KEY FK_constraint;



📍COSNTRAINT 생성 문법 - 테이블 이후

Table 이 생성된 이후에도 ALTER TABLE 을 통해 FOREIGN KEY 를 지정할 수 있다.

ALTER TABLE tablename
ADD FOREIGN (column) REFERENCES REF_tablename(REF_column);





- FOREIGN KEY 예제1

- FOREIGN KEY 생성 예제

create table orders(
    oid int not null,
    order_no varchar(16),
    pid int,
    PRIMARY KEY(oid),
    CONSTRAINT FK_person FOREIGN KEY (pid) REFERENCES person(pid)
);



- FOREIGN KEY 생성 예제
CREATE TABLE 에서 FOREIGN KEY를 지정하는 경우, CONSTRAINT 를 생략할 수 있다.

create table job
(
    jid int not null,
    name varchar(16),
    pid int,
    primary key (jid),
    foreign key (pid) references person(pid)
);



- FOREIGN KEY 삭제 예제

 alter table orders
drop foreign key FK_person;


외래키가 끊어진 것을 알 수 있다.



- Table 이 생성된 이후 ALTER TABLE 을 통해 FOREIGN KEY 를 지정

alter table orders
add foreign key (pid) references person(pid);




- FOREIGN KEY 예제2

1. police_station 과 crime_status 테이블 사이에 관계 (Foreign Key)를 설정해 봅시다.
AWS RDS(database-1) 의 zerobase 에서 작업합니다.

- 확인


- police_station table

# 중복을 제거하고 개수 가져오기
select count(distinct name) from police_station;


- crime_status table

select count(distinct police_station) from crime_status;



select distinct name from police_station limit 3;

select distinct police_station from crime_status limit 3;



- 두 테이블 경찰서명 맞춰주기

select c.police_station, p.name
from crime_status c, police_station p
where p.name like concat('서울', c.police_station, '경찰서')
group by c.police_station, p.name;



- primary key 생성

1. police_station 테이블의 name 컬럼 기본키로 만들기

alter table police_station
add primary key (name);



2.crime_status 테이블의 컬럼 생성 후 foreign key로 만들기

alter table crime_status
add column reference varchar(16);


alter table crime_status
add foreign key(reference) references police_station(name);



- reference 컬럼 내용 채우기

update crime_status c, police_station p
    -> set c.reference = p.name
    -> where p.name like concat('서울', c.police_station, '경찰서');

데이터 확인

select distinct police_station, reference from crime_status;



3. join

select c.police_station, p.address
from crime_status c, police_station p
where c.reference = p.name
group by c.police_station;




"이 글은 제로베이스 데이터 취업 스쿨 강의를 듣고 작성한 내용으로 제로베이스 데이터 취업 스쿨 강의 자료 일부를 발췌한 내용이 포함되어 있습니다."

0개의 댓글