[SECTION03. DDL 심화와 제약조건]
ALTER TABLE member ADD COLUMN phone VARCHAR(20);
기본값을 지정하면서 추가할 수도 있습니다.
ALTER TABLE member ADD COLUMN is_active BOOLEAN DEFAULT TRUE;
컬럼을 추가하면 기존에 저장되어 있던 행들은 새 컬럼 값이 NULL(또는 DEFAULT 값)로 채워집니다.
-- 컬럼 삭제
ALTER TABLE member DROP COLUMN phone;
-- 컬럼 타입 변경 (H2 기준)
ALTER TABLE member ALTER COLUMN name VARCHAR(100);
-- 컬럼 이름 변경 (H2 기준)
ALTER TABLE member RENAME COLUMN phone TO mobile;
컬럼을 삭제하면 그 컬럼에 저장되어 있던 데이터도 함께 사라집니다. 운영 중인 서비스에서는 컬럼 삭제 전에 반드시 백업하거나 신중하게 검토해야 합니다.
| 명령어 | 데이터 | 구조 | 되돌리기 |
|---|---|---|---|
| DROP TABLE | 삭제됨 | 테이블 자체가 사라짐 | 다시 CREATE TABLE 필요 |
| TRUNCATE TABLE | 삭제됨 | 테이블 구조는 유지 | 구조는 남아있어 바로 INSERT 가능 |
| DELETE FROM (조건 없이) | 삭제됨 | 구조 유지 | TRUNCATE와 비슷하지만 속도가 더 느림 |
CREATE TABLE comment (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
content VARCHAR(500) NOT NULL,
board_id BIGINT NOT NULL,
member_id BIGINT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (board_id) REFERENCES board(id),
FOREIGN KEY (member_id) REFERENCES member(id)
);
-- 테이블 자체를 삭제
DROP TABLE comment;
-- 테이블은 남기고 데이터만 전체 삭제
TRUNCATE TABLE comment;
FK로 참조되고 있는 테이블은 참조하는 테이블을 먼저 DROP/TRUNCATE 해야 에러가 나지 않습니다. (예: comment가 board를 참조한다면 comment를 먼저 처리)
CREATE TABLE member (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT CHECK (age >= 0 AND age <= 150)
);
age 컬럼에는 0~150 사이의 값만 들어갈 수 있습니다. 범위를 벗어나면 INSERT/UPDATE 시 에러가 발생합니다.
CREATE TABLE board (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
view_count INT DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
게시글을 등록할 때 view_count를 따로 지정하지 않으면 자동으로 0이 들어갑니다.
게시글 “좋아요” 기능을 예로 들면, “한 회원이 한 게시글에 좋아요를 한 번만 누를 수 있다”는 규칙이 필요합니다.
CREATE TABLE member (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
password VARCHAR(100) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE board (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(200) NOT NULL,
content TEXT NOT NULL,
member_id BIGINT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (member_id) REFERENCES member(id)
);
CREATE TABLE board_like (
board_id BIGINT NOT NULL,
member_id BIGINT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (board_id, member_id),
FOREIGN KEY (board_id) REFERENCES board(id),
FOREIGN KEY (member_id) REFERENCES member(id)
);
board_id와 member_id를 합쳐서 PK로 지정하면, 같은 (board_id, member_id) 조합은 두 번 들어갈 수 없습니다. 즉 같은 회원이 같은 게시글에 좋아요를 두 번 누르는 것을 DB 차원에서 막을 수 있습니다.