정규화와 스키마 설계

← 목록
1 / 1

PostgreSQL 제약조건 실습 — NOT NULL, DEFAULT, CHECK, PK, FK

newlec뉴렉처 공식2026. 10. 12.

이번 실습에서는 제약조건을 이해한 후에 실제로 테이블에 제약조건을 설정했을 때, 그 조건이 잘 수반되는지 실습해보는 시간이다.

대상 제약조건 노트를 읽었고, PostgreSQL 기본 문법(CREATE TABLE, INSERT, SELECT)을 아는 학생

목표 도메인, 체크, 엔티티, 관계 제약을 PostgreSQL 에서 순서대로 적용하고 에러 메시지를 확인한다

완성물 categories_N, menus_N 테이블에 모든 제약을 적용하고, 유효/무효 데이터로 검증한 뒤 테이블을 삭제한 상태

주의 ) 현재 DBMS PostgreSQL 하나의 인스턴스에 여러명이 접속해서 사용하는 경우, 실습을 위해 생성하는 테이블 이름에 각자 다른 일련번호(예: 1, 2, 3)를 붙여서 생성해야 한다. 아래 예제에서는 테이블명_1 은 각자의 식별 변호라고 가정한다.


STEP 1 / 13제약 없는 테이블 생성과 기본 데이터 입력

0개 완료 · 13개 남음

  1. 가장 먼저 아무 제약도 없는 테이블을 만들고 데이터를 넣는다. 이 상태가 "문제 발견"의 기준선이 된다.

    1-1. categories_1 테이블 생성

    파일: sql/01_create_categories.sql

    CREATE TABLE categories_1 (
        id INTEGER,
        name VARCHAR(50),
        slug VARCHAR(50),
        created_at TIMESTAMP
    );

    1-2. menus_1 테이블 생성

    파일: sql/02_create_menus.sql

    CREATE TABLE menus_1 (
        id INTEGER,
        name VARCHAR(50),
        price INTEGER,
        status VARCHAR(10),
        category_id INTEGER,
        created_at TIMESTAMP
    );

    1-3. 초기 데이터 입력

    파일: sql/03_insert_initial.sql

    INSERT INTO categories_1 (id, name, slug, created_at) VALUES
    (1, 'Coffee', 'coffee', NOW()),
    (2, 'Tea', 'tea', NOW());
    
    INSERT INTO menus_1 (id, name, price, status, category_id, created_at) VALUES
    (1, 'Americano', 4000, 'on', 1, NOW()),
    (2, 'Green Tea', 3000, 'on', 2, NOW());

    1-4. 데이터 확인

    파일: sql/04_select_initial.sql

    SELECT * FROM categories_1;
    SELECT * FROM menus_1;

    ✅ 확인

    • categories_1 에 2행, menus_1 에 2행이 보인다.
    • 모든 컬럼에 값이 들어 있다.

    🎓 newlec 쌤의 코멘트

    이 단계의 테이블은 "빈 캔버스"다. 아직 어떤 규칙도 없다. 다음 단계에서 이 빈 캔버스에 문제를 의도적으로 만들어 본다. 실무에서는 이렇게 제약 없는 테이블을 만들지 않지만, 학습을 위해 "제약이 없으면 무엇이 깨지는가"를 먼저 보여주는 것이 중요하다.

    ❌ 자주 하는 실수

    증상 원인 해결
    relation "categories_1" already exists 이전 실행 잔재 DROP TABLE IF EXISTS categories_1, menus_1; 후 재시도

    📝 이 단계의 핵심

    • 제약 없는 테이블은 모든 값, NULL 포함, 허용한다.
    • NOW() 는 현재 시각을 반환하는 PostgreSQL 함수다.

이어지는 내용은 회원만 볼 수 있어요

뉴렉처에 로그인하면 전체 학습 자료를 열람할 수 있습니다.

로그인하기