CREATE TABLE과 제약조건으로 견고한 데이터 구조를 만드는 방법.
테이블 설계와 제약조건
좋은 데이터베이스는 좋은 테이블 설계에서 시작합니다. 적절한 데이터 타입과 제약조건을 걸어 두면, 잘못된 데이터가 애초에 들어오지 못하게 막을 수 있습니다. 테이블 구조를 정의하는 명령을 DDL(Data Definition Language) 이라고 합니다.
학습 목표
CREATE/ALTER/DROP TABLE로 테이블을 정의하고 변경합니다.- 자주 쓰는 데이터 타입을 적절히 선택합니다.
- NOT NULL·DEFAULT·UNIQUE·CHECK·PK·FK 제약을 적용합니다.
IDENTITY로 자동 증가 키를 만듭니다.
주요 데이터 타입
| 분류 | 타입 | 설명 |
|---|---|---|
| 정수 | INT, BIGINT, SMALLINT | 정수 |
| 실수 | DECIMAL(p,s), FLOAT | 고정/부동 소수 |
| 문자 | VARCHAR(n), NVARCHAR(n) | 가변 문자열(N=유니코드) |
| 날짜 | DATE, DATETIME2, TIME | 날짜·시간 |
| 논리 | BIT | 0/1 (true/false) |
💡 TIP — 한글·이모지 등 다국어 문자열은
NVARCHAR를 쓰세요.VARCHAR는 코드페이지에 따라 한글이 깨질 수 있습니다. 금액은 오차가 없는DECIMAL을, 부동소수FLOAT는 피하는 것이 좋습니다.
CREATE TABLE
CREATE TABLE Employees (
id INT IDENTITY(1,1) PRIMARY KEY,
name NVARCHAR(50) NOT NULL,
email NVARCHAR(100) UNIQUE,
department NVARCHAR(30) NOT NULL DEFAULT 'Unassigned',
salary DECIMAL(12,2) CHECK (salary >= 0),
dept_id INT NULL,
created_at DATETIME2 NOT NULL DEFAULT SYSDATETIME(),
CONSTRAINT FK_emp_dept FOREIGN KEY (dept_id)
REFERENCES Departments(id)
);
제약조건 정리
| 제약 | 의미 |
|---|---|
NOT NULL | 빈 값 금지 |
DEFAULT | 값 미지정 시 기본값 |
UNIQUE | 중복 금지 (NULL은 1개 허용) |
CHECK | 조건을 만족해야 입력 가능 |
PRIMARY KEY | 유일 + NOT NULL, 행 식별자 |
FOREIGN KEY | 다른 테이블 PK 참조 |
IDENTITY — 자동 증가
id INT IDENTITY(1,1) PRIMARY KEY -- 1부터 1씩 증가
IDENTITY(seed, increment) 로 시작값과 증가폭을 정합니다. 삽입 시 값을 지정하지 않으면 자동으로 채워집니다.
CHECK 제약 예시
ALTER TABLE Products
ADD CONSTRAINT CK_price_positive CHECK (price > 0);
ALTER TABLE — 구조 변경
-- 열 추가
ALTER TABLE Employees ADD phone NVARCHAR(20) NULL;
-- 열 타입 변경
ALTER TABLE Employees ALTER COLUMN name NVARCHAR(100) NOT NULL;
-- 열 삭제
ALTER TABLE Employees DROP COLUMN phone;
-- 제약 추가
ALTER TABLE Employees
ADD CONSTRAINT UQ_emp_email UNIQUE (email);
⚠️ 주의 — 운영 중인 큰 테이블에
ALTER COLUMN을 하면 테이블 전체가 잠기거나 오래 걸릴 수 있습니다. 사용량이 적은 시간대에, 가능하면 사전에 테스트한 뒤 적용하세요.
DROP / 외래키와 참조 동작
DROP TABLE Employees; -- 테이블 자체를 제거
외래키에는 부모가 삭제·수정될 때의 동작을 지정할 수 있습니다.
CONSTRAINT FK_emp_dept FOREIGN KEY (dept_id)
REFERENCES Departments(id)
ON DELETE SET NULL -- 부서 삭제 시 dept_id를 NULL로
ON UPDATE CASCADE -- 부서 id 변경 시 함께 변경
| 옵션 | 동작 |
|---|---|
NO ACTION | 참조 중이면 삭제/수정 거부(기본) |
CASCADE | 함께 삭제/수정 |
SET NULL | 참조 열을 NULL로 |
SET DEFAULT | 참조 열을 기본값으로 |
요약
- 데이터 타입은 용도에 맞게(한글은
NVARCHAR, 금액은DECIMAL) 선택합니다. - 제약조건(NOT NULL·UNIQUE·CHECK·PK·FK)으로 잘못된 데이터를 차단합니다.
IDENTITY는 자동 증가 키를 생성합니다.ALTER TABLE로 열·제약을 추가·변경·삭제하되, 큰 테이블은 주의합니다.- 외래키는
ON DELETE/ON UPDATE로 참조 동작을 정합니다.
연습문제
- 자동 증가 PK, NOT NULL 이름, UNIQUE 이메일을 가진
Members테이블을 만드세요. Products테이블에price > 0을 강제하는 CHECK 제약을 추가하세요.Members에joined_at열을 기본값 현재시각으로 추가하세요.- 부서 삭제 시 직원의
dept_id가 NULL이 되도록 외래키를 정의하세요.
힌트 — 3번은
ADD joined_at DATETIME2 DEFAULT SYSDATETIME(), 4번은ON DELETE SET NULL입니다.
💡 연습문제 풀이
불러오는 중…
댓글 0
“MSSQL” 강좌에 대한 댓글입니다.