02_Database

10_테이블(Table)

chuu_travel 2025. 1. 29. 20:21
728x90
테이블(Table)

 

표 형태로 구성된 2차원 구조로, 행과 열로 구성됨

 

행은 로우(row)나 레코드(record)라고 부르며

열은 컬럼(column) 또는 필드(field)라고 부름

 

엑셀과 유사한 형태

 

create database naver_db;

☞ 데이터베이스 만들기

 

drop database if exists naver_db;

기존에 naver_db가 있다면 삭제

 

sql로 테이블 만들기

 

use naver_db;

  naver_db 데이터베이스를 사용하겠다

 

drop table if exists member;

 기존에 member 테이블이 있다면 삭제

 

create table member

( mem_id char(3) not null primary key, -- 회원 아이디(pk)

mem_name varchar(10) not null, -- 이름

mem_number tinyint not null -- 인원수

);

null: 기본값. null값을 허용한다
not null: null을 허용하지 않는다. 반드시 값을 넣어야 함

 

insert into member values('TWC', '트와이스', 9);

insert into member values('BLK', '블랙핑크', 4);

insert into member values('WMN', '여자친구', 6);

select * from member;

 

buy 테이블

auto_increment열은 반드시 primary key 또는 unique key로 지정해야함

drop table if exists buy;

create table buy

( num int auto_increment not null primary key, -- 순번(pk)

mem_id char(8) not null, -- 아이디(fk)

prod_name char(6) not null, -- 제품 이름

foreign key (mem_id) references member (mem_id)

);

 

insert into buy (mem_id, prod_name) values ('BLK', '지갑');

insert into buy (mem_id, prod_name) values ('BLK', '맥북프로');

insert into buy (mem_id, prod_name) values ('APN', '아이폰');

APN은 아직 회원 테이블에 존재하지 않아서 오류 발생

 

01. 제약조건

 

테이블을 만들 때는 테이블의 구조에 필요한 제약조건을 설정해야 함

앞에서 배운 기본키(primary key)외래키(foreign key)가 대표적인 제약조건

 

 

제약조건의 기본 개념

제약조건(constraint)은 데이터의 무결성을 지키기 위해 제한하는 조건

 

데이터의 무결성: 데이터에 결함이 없다는 의미

예) 네이버의 회원 아이디가 중복되면 네이버의 모든 서비스 이용에 혼란이 일어남

위의 예시와 같은 결함이없는 것을 데이터의 무결성 이라고 표현

 

예시 상황에서는 데이터의 무결성을 위해 회원 테이블의 아이디를 기본키로 지정할 수 있음

기본키로 설정하면 중복된 아이디를 실수로 입력하려고 해도 입력이 불가능

 

02. 제약조건의 종류
primary key
foreign key
unique
check
default 정의
null값 허용

 

03. 기본키(primary key)

 

테이블의 많은 데이터 중에 데이터를 구분할 수 있는 식별자

예) 회원 아이디, 학생의 학번, 직원의 사번

기본키의 값은 중복될 수 없으며, null값이 입력될 수 없음

 

대부분의 테이블은 기본키를 가져야 함

테이블은 기본키를 1개만 가질 수 있음

아이디, 주민등록번호, 이메일 처럼 기본키로 설정할 수 있는 열이 여러 개인 경우에는

테이블의 특성을 가장 잘 반영하는 열을 선택하는 것이 좋음

 

create table에서 기본키 제약조건 설정

 

use naver_db;

create table member

( mem_id char(8) not null primary key,

mem_name varchar(10) not null,

height tinyint unsigned null);

 

desc member;

 

 

create table의 마지막 행에 primary key를 추가할 수도 있음

 

drop table if exists member;

create table member

( mem_id char(8) not null,

mem_name varchar(10) not null,

height tinyint unsigned null,

primary key (mem_id)

);

 

desc member;

 

alter table에서 기본키 제약조건 설정

이미 만들어진 테이블을 alter table을 통해 수정하여 기본키를 설정하는 방법

drop table if exists member;

create table member

( mem_id char(8) not null,

mem_name varchar(10) not null,

height tinyint unsigned null

);

 

alter table member -- member 테이블을 수정

add constraint -- 제약조건을 추가

primary key (mem_id); -- mem_id 열에 기본키 제약조건을 설정

 

desc member;

 

 

04. 외래키 제약조건

 

외래키(foreign key): 두 테이블 사이의 관계를 연결해주고, 그 결과 데이터의 무결성을 보장
외래키가 설정된 열은 다른 테이블의 기본키와 연결됨

 


member테이블과 buy테이블이 기본키-외래키 관계

 

이 경우, 기본키가 있는 member 테이블을 기준 테이블이라고 하며

외래키가 있는 buy테이블을 참조테이블이라고 함

 

구매 테이블의 FK는 반드시 회원테이블의 PK로 존재함


 

예) 네이버쇼핑에서 제품을 구매한 기록이 있는 사람은 네이버쇼핑의 회원이어야 함

외래키를 사용하면 구매한 기록은 있지만 구매한 사람이 누구인지 알 수 없는 상황은 발생하지 않음

따라서 구매 테이블의 모든 데이터는 누가 구매했는지 확실하게 알 수 있는 무결한 데이터가 됨

 

create table 에서 외래키 제약조건 설정

기본 형식: foreign key(열이름) references 기준테이블(열이름)

구매 테이블의 열(mem_id)이 참조(references)하는 기준 테이블(member)의 열(mem_id)

 

 

기준 테이블의 열이 primary key또는 unique가 아니라면 외래키 관계는 설정되지 않음

drop table if exists buy;

create table buy

( num int auto_increment not null primary key,

mem_id char(8) not null,

prod_name char(6) not null,

foreign key(mem_id) references member(mem_id)

);

 

 

alter table에서 외래키 제약조건 설정

drop table if exists buy;

create table buy

( num int auto_increment not null primary key,

mem_id char(8) not null,

prod_name char(6) not null

);

alter table buy -- buy 테이블을 수정

add constraint -- 제약조건을 추가

foreign key(mem_id) -- 외래키 제약조건을 buy 테이블의 mem_id에 설정

references member(mem_id); -- 참조할 기준 테이블은 member 테이블의 mem_id 열

 

 

PK-FK관계 설정 시 기준 테이블의 열이 변경되는 경우

insert into member values ('BLK', '블랙핑크', 163);

insert into buy (mem_id, prod_name) values ('BLK', '지갑');

insert into buy (mem_id, prod_name) values ('BLK', '맥북');

 

select m.mem_id, m.mem_name, b.prod_name

from buy b

inner join member m

on b.mem_id = m.mem_id;

 

 

BLK의 아이디를 PINK로 변경

update member set mem_id = 'PINK' where mem_id = 'BLK';

 

기본키-외래키로 맺어진 후에는 기준 테이블의 열이 변경되지 않음

데이터가 변경되면 참조 테이블의 데이터에 문제가 발생하기 때문

 

지금은 회원 테이블의 BLK가 물건을 구매한 기록이 구매 테이블에 존재하기 때문에 변경 불가한 것

만약 BLK가 물건을 구매한 적이 없다면(구매 테이블에 데이터가 없다면) 회원 테이블의 BLK는 변경 가능

 

 

BLK를 삭제

use naver_db;

delete from member where mem_id = 'BLK';

 

 

기본키-외래키 관계가 설정되면 기준 테이블의 열은 변경되거나 삭제되지 않음

하지만 기준 테이블의 열 이름이 변경될 때 참조 테이브의 열 이름이 자동으로 함께 변경된다면 더 효율적일 것임

 

즉, 회원 테이블의 BLK가 PINK로 변경되면 자동으로 구매 테이블의 BLK도 PINK로 변경되는 것

위와 같은 기능을 위해 on delete cascade와 on update cascade를 사용할 수 있음

기준 테이블의 데이터가 수정되거나 삭제되면 참조 테이블의 데이터도 함께 변경되는 기능

drop table if exists buy;

create table buy

( num int auto_increment not null primary key,

mem_id char(8) not null,

prod_name char(6) not null);

 

alter table buy

add constraint

foreign key(mem_id)

references member(mem_id)

on update cascade

on delete cascade;

 

desc buy;

 

insert into buy (mem_id, prod_name) values ('BLK', '지갑');

insert into buy (mem_id, prod_name) values ('BLK', '맥북');

select * from buy;

 

select m.mem_id, m.mem_name, b.prod_name

from buy b

inner join member m

on b.mem_id = m.mem_id;

 

 

member테이블의 BLK를 PINK로 변경

update member set mem_id = 'PINK' where mem_id = 'BLK';

 

PINK를 기준 테이블에서 삭제

delete from member where mem_id = 'PINK';

☞ 구매 테이블을 확인하면 PINK의 데이터가 함께 삭제되었음

 

 

05. 기타 제약 조건

 

고유키 제약조건

고유키(unique) 제약조건: 중복되지 않는 유일한 값을 입력해야 하는 조건

기본키 제약조건과 거의 비슷하지만, 고유키 제약조건은 NULL값을 허용한다는 것이 차이점

 

null값은 여러 개가 입력되어도 상관없음

또 다른 차이점은 기본키는 테이블에 1개만 설정할 수 있지만 고유키는 여러 개를 설정할 수 있음

예) 회원 테이블에 email주소가 있다면 중복되지 않으므로 고유키로 설정할 수 있음

drop table if exists buy, member;

create table member

( mem_id char(8) not null primary key,

mem_name varchar(10) not null,

height tinyint unsigned null,

email char(30) null unique);

 

 

중복된 데이터 입력

insert into member values ('BLK', '블랙핑크', 163, 'pink@gmail.com');

insert into member values ('TWC', '트와이스', 167, null);

insert into member values ('APN', '에이핑크', 164, 'pink@gmail.com');

☞ 이메일이 중복되기 때문에 오류 발생

 

 

06. 체크 제약 조건

 

체크(check) 제약조건: 입력되는 데이터를 점검하는 기능

예) height에 마이너스 값이 입력되지 않도록 하거나, 연락처의 국번에 02, 031, 041, 055 중 하나만

입력되도록 하는 것

 

height는 반드시 100이상의 값만 입력되도록 체크 제약조건을 설정하는 예시

 

drop table if exists member;

create table member

( mem_id char(8) not null primary key,

mem_name varchar(10) not null,

height tinyint unsigned null check (height >= 100),

phone1 char(3) null);

 

☞ 열 정의 뒤에 check(조건)을 추가하면 됨

 

 

데이터 입력

insert into member values ('BLK', '블랙핑크', 163, null);

insert into member values ('TWC', '트와이스', 99, null);

 

 

테이블을 만든 후에 alter table로 체크 제약조건을 추가하는 것도 가능

alter table member

add constraint

check (phone1 in ('02', '031', '032', '054', '055', '061'));

 

 

데이터 입력

insert into member values ('TWC', '트와이스', 167, '02');

insert into member values ('OMY', '오마이걸', 167, '010');

 

 

기본값 정의

기본값(default) 정의: 값을 입력하지 않았을 때 자동으로 입력될 값을 미리 지정하는 방법

예) height를 입력하지 않고 기본적으로 160이라고 입력되도록 하고 싶은 경우

drop table if exists member;

create table member

( mem_id char(8) not null primary key,

mem_name varchar(10) not null,

height tinyint unsigned null default 160,

phone1 char(3) null);

 

 

alter table로 default를 지정하기 위해서는 alter column을 사용

예) 연락처의 국번을 입력하지 않으면 자동으로 '02'가 입력되도록 하려는 경우

alter table member

alter column phone1 set default '02';

 

 

기본값이 설정된 열에 기본값을 입력하려면 default라고 입력

insert into member values ('RED', '레드벨벳', 161, '054');

insert into member values ('SPC', '우주소녀', default, default);

select * from member;

 

insert into member (mem_id, mem_name) values ('OMY', '오마이걸');

 

 

07. NULL값 허용

 

● NULL값을 허용하려면 생략하거나 NULL을 입력하고, 허용하지 않으려면 NOT NULL을 입력

 

  PRIMARY KEY가 설정된 열에는 NULL값이 있을 수 없으므로 생략하면 자동으로 NOT NULL로 인식함

 

  NULL은 '아무것도 없다'라는 의미이므로 공백(' ')이나 0과는 다름

728x90

'02_Database' 카테고리의 다른 글

12_인덱스(index)  (2) 2025.01.30
11_뷰(View)  (3) 2025.01.29
09_조인  (2) 2025.01.29
08_MySQL의 데이터 형식  (0) 2025.01.29
07_데이터 삭제(DELETE)  (3) 2025.01.29