dev.syw

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날짜·시간
논리BIT0/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 로 참조 동작을 정합니다.

연습문제

  1. 자동 증가 PK, NOT NULL 이름, UNIQUE 이메일을 가진 Members 테이블을 만드세요.
  2. Products 테이블에 price > 0 을 강제하는 CHECK 제약을 추가하세요.
  3. Membersjoined_at 열을 기본값 현재시각으로 추가하세요.
  4. 부서 삭제 시 직원의 dept_id 가 NULL이 되도록 외래키를 정의하세요.

힌트 — 3번은 ADD joined_at DATETIME2 DEFAULT SYSDATETIME(), 4번은 ON DELETE SET NULL 입니다.

💡 연습문제 풀이

불러오는 중…

함께 보면 좋은 자료

댓글 0

MSSQL” 강좌에 대한 댓글입니다.

댓글을 작성하려면 로그인이 필요합니다.