멀티캠퍼스

[2026.05.13] - TIL 29일차 SQL 제약조건, 테이블 생성, ALTER, INSERT 정리

buckwheat 2026. 5. 18. 03:22

 

목차
1 제약조건 설정 방법
2 UNIQUE 제약조건
3 제약조건 이름 설정
4 CHECK 제약조건
5 PRIMARY KEY 제약조건
6 FOREIGN KEY 제약조건
7 외래키 삭제 옵션
8 서브쿼리를 활용한 테이블 생성
9 DEFAULT 값 설정
10 ALTER TABLE
11 DML과 INSERT
12 INSERT와 서브쿼리

 

1 제약조건 설정 방법

1) 컬럼 레벨 제약조건

 

    (1) 컬럼 레벨의 의미

    컬럼 레벨 제약조건은 컬럼을 선언하는 동시에 제약조건을 설정하는 방식이다.

    특정 컬럼 하나에 바로 제약조건을 붙이고 싶을 때 사용한다.

 

    (2) 사용 상황

    ID 컬럼에 UNIQUE를 붙이거나, PW 컬럼에 NOT NULL을 붙이는 것처럼 하나의 컬럼에 직접 규칙을 정할 때 사용한다.

    컬럼과 제약조건의 관계가 바로 보여서 간단한 제약조건을 설정할 때 보기 쉽다.

 

2) 테이블 레벨 제약조건

 

    (1) 테이블 레벨의 의미

    테이블 레벨 제약조건은 컬럼을 모두 작성한 뒤, 마지막에 별도로 제약조건을 설정하는 방식이다.

    컬럼 선언 부분과 제약조건 부분을 분리해서 작성할 수 있다.

 

    (2) 사용 상황

    여러 컬럼을 묶어서 UNIQUE나 PRIMARY KEY를 설정할 때는 테이블 레벨 방식이 필요하다.

    예를 들어 NO와 ID를 함께 묶어 중복을 막고 싶을 때 사용할 수 있다.


2 UNIQUE 제약조건

1) UNIQUE의 개념

 

    (1) UNIQUE의 역할

    UNIQUE는 특정 컬럼에 중복된 값이 들어가지 못하게 하는 제약조건이다.

    회원 아이디, 이메일, 주민등록번호처럼 같은 값이 두 번 들어가면 안 되는 데이터에 사용한다.

 

    (2) UNIQUE를 사용하는 이유

    데이터가 중복되면 사용자를 구분하기 어렵거나 잘못된 정보가 저장될 수 있다.

    UNIQUE를 설정하면 테이블 안에서 특정 값이 고유하게 유지된다.

 

2) 테이블 레벨 UNIQUE

 

    (1) 테이블 레벨 UNIQUE의 역할

    테이블 레벨에서는 컬럼 선언이 끝난 뒤 UNIQUE 조건을 따로 작성한다.

    특정 컬럼에 중복을 허용하지 않도록 테이블 전체 규칙으로 설정할 수 있다.

 

    (2) ID 중복 방지

    ID 컬럼에 UNIQUE를 설정하면 같은 ID를 가진 회원을 두 번 저장할 수 없다.

    로그인 아이디처럼 고유해야 하는 값에 적합하다.

 

3) 복합 UNIQUE

 

    (1) 복합 UNIQUE의 의미

    복합 UNIQUE는 두 개 이상의 컬럼을 묶어서 중복을 막는 방식이다.

    각각의 컬럼 값은 중복될 수 있어도, 묶인 조합이 같으면 저장할 수 없다.

 

    (2) 사용 예

    NO와 ID를 묶어서 UNIQUE를 설정하면 NO와 ID의 조합이 중복되지 않도록 막을 수 있다.

    NO가 같아도 ID가 다르면 저장될 수 있고, ID가 같아도 NO가 다르면 저장될 수 있다.


3 제약조건 이름 설정

1) 제약조건 이름의 개념

 

    (1) 제약조건 이름을 설정하는 이유

    제약조건 이름을 직접 설정하면 나중에 어떤 제약조건인지 쉽게 확인할 수 있다.

    이름을 정하지 않으면 데이터베이스가 자동으로 SYS_C와 같은 이름을 부여한다.

 

    (2) 관리 편의성

    제약조건을 수정하거나 삭제할 때는 제약조건 이름이 필요하다.

    직접 의미 있는 이름을 붙이면 오류 확인이나 관리가 더 편해진다.

 

2) CONSTRAINT 키워드

 

    (1) CONSTRAINT의 역할

    CONSTRAINT는 제약조건에 이름을 붙일 때 사용하는 키워드이다.

    CONSTRAINT 뒤에 제약조건 이름을 작성하고, 그 뒤에 NOT NULL, UNIQUE, PRIMARY KEY 같은 제약조건을 작성한다.

 

    (2) 이름 작성 예

    NN_CONSNAME_D1처럼 NOT NULL 제약조건임을 알 수 있는 이름을 붙일 수 있다.

    U_CONSNAME_D2처럼 UNIQUE 제약조건임을 알 수 있는 이름을 붙이면 관리하기 쉽다.


4 CHECK 제약조건

1) CHECK의 개념

 

    (1) CHECK의 역할

    CHECK는 컬럼에 저장할 수 있는 값을 조건으로 제한하는 제약조건이다.

    정해진 값이나 범위를 벗어나는 데이터가 들어가지 못하도록 막는다.

 

    (2) CHECK를 사용하는 이유

    잘못된 값이 저장되면 데이터의 신뢰성이 떨어진다.

    CHECK를 사용하면 성별, 점수, 날짜, 수량처럼 허용 가능한 범위를 미리 정할 수 있다.

 

2) 값 목록 제한

 

    (1) IN 조건 사용

    CHECK에서 IN을 사용하면 지정한 값 중 하나만 저장되도록 제한할 수 있다.

    예를 들어 성별 컬럼에 남 또는 여만 저장되게 만들 수 있다.

 

    (2) 사용 상황

    상태값, 성별, 등급처럼 선택 가능한 값이 정해져 있는 컬럼에 적합하다.

    허용하지 않은 값이 들어오면 데이터베이스가 저장을 막는다.

 

3) 범위 제한

 

    (1) 비교 연산자 사용

    CHECK에서는 DATA > 5처럼 비교 연산자를 사용할 수 있다.

    특정 값보다 크거나 작아야 하는 조건을 만들 때 사용한다.

 

    (2) 여러 조건 사용

    CHECK 조건 안에서 AND를 사용하면 여러 범위를 동시에 제한할 수 있다.

    예를 들어 5보다 크고 50보다 작은 값만 저장하도록 만들 수 있다.

 

4) 하나의 컬럼에 여러 제약조건 설정

 

    (1) 여러 제약조건 적용

    하나의 컬럼에도 NOT NULL, UNIQUE, CHECK 같은 제약조건을 여러 개 설정할 수 있다.

    필수값이면서 중복이 불가능하고, 동시에 특정 범위 안의 값만 허용하도록 만들 수 있다.

 

    (2) 데이터 품질 관리

    여러 제약조건을 함께 사용하면 잘못된 데이터가 저장될 가능성을 줄일 수 있다.

    데이터가 정확하고 일관되게 유지되도록 도와준다.


5 PRIMARY KEY 제약조건

1) PRIMARY KEY의 개념

 

    (1) PRIMARY KEY의 역할

    PRIMARY KEY는 테이블의 각 행을 구분하기 위한 기본키 제약조건이다.

    테이블 안에서 특정 행을 유일하게 식별할 수 있는 컬럼에 설정한다.

 

    (2) PRIMARY KEY의 특징

    PRIMARY KEY는 NOT NULL과 UNIQUE의 성격을 함께 가진다.

    반드시 값이 있어야 하고, 중복된 값이 들어갈 수 없다.

 

    (3) 사용 상황

    회원번호, 사원번호, 게시글번호처럼 각각의 데이터를 구분해야 하는 컬럼에 사용한다.

    테이블에서 하나의 행을 정확히 찾기 위한 기준이 된다.

 

2) 단일 컬럼 기본키

 

    (1) 단일 컬럼 기본키의 의미

    하나의 컬럼만으로 각 행을 구분할 수 있을 때 단일 컬럼 기본키를 사용한다.

    예를 들어 NO 컬럼이 모든 회원을 구분할 수 있다면 NO를 기본키로 설정할 수 있다.

 

    (2) 중복과 NULL 제한

    기본키 컬럼에는 같은 값이 두 번 들어갈 수 없다.

    또한 NULL 값도 저장할 수 없기 때문에 반드시 식별 가능한 값이 들어가야 한다.

 

3) 복합 기본키

 

    (1) 복합 기본키의 의미

    복합 기본키는 두 개 이상의 컬럼을 묶어서 하나의 기본키로 사용하는 방식이다.

    하나의 컬럼만으로는 행을 구분하기 어렵지만, 여러 컬럼을 조합하면 구분할 수 있을 때 사용한다.

 

    (2) 사용 예

    NO와 ID를 함께 묶으면 두 값의 조합을 기준으로 행을 구분할 수 있다.

    단, ID 컬럼에 별도로 UNIQUE가 설정되어 있다면 ID 자체의 중복도 제한된다.


6 FOREIGN KEY 제약조건

1) FOREIGN KEY의 개념

 

    (1) FOREIGN KEY의 역할

    FOREIGN KEY는 다른 테이블의 값을 참조하는 외래키 제약조건이다.

    두 테이블 사이의 관계를 연결할 때 사용한다.

 

    (2) 참조 관계

    외래키를 설정하면 자식 테이블은 부모 테이블에 존재하는 값만 저장할 수 있다.

    예를 들어 회원 테이블의 GRADE_CODE는 등급 테이블에 존재하는 GRADE_CODE만 저장할 수 있다.

 

    (3) FOREIGN KEY를 사용하는 이유

    존재하지 않는 등급코드나 잘못된 참조값이 저장되는 것을 막을 수 있다.

    테이블 사이의 관계를 유지하고 데이터 무결성을 보장하는 역할을 한다.

 

2) 부모 테이블과 자식 테이블

 

    (1) 부모 테이블

    부모 테이블은 참조되는 값을 가진 테이블이다.

    예를 들어 USER_GRADE 테이블은 회원 등급 정보를 가지고 있으므로 부모 테이블 역할을 한다.

 

    (2) 자식 테이블

    자식 테이블은 부모 테이블의 값을 참조하는 테이블이다.

    USER_FOREIGN_KEY 테이블은 GRADE_CODE를 통해 USER_GRADE를 참조하므로 자식 테이블 역할을 한다.

 

3) 외래키 작성 방식

 

    (1) 컬럼 레벨 방식

    컬럼을 선언하면서 바로 REFERENCES를 작성해 외래키를 설정할 수 있다.

    하나의 컬럼이 다른 테이블의 컬럼을 참조할 때 간단히 사용할 수 있다.

 

    (2) 테이블 레벨 방식

    컬럼을 모두 작성한 뒤 FOREIGN KEY와 REFERENCES를 사용해 외래키를 설정할 수 있다.

    제약조건 이름을 붙이거나 구조를 명확히 표현할 때 사용하기 좋다.


7 외래키 삭제 옵션

1) 삭제 옵션의 개념

 

    (1) 삭제 옵션의 역할

    삭제 옵션은 부모 테이블의 데이터가 삭제될 때, 그 값을 참조하던 자식 데이터를 어떻게 처리할지 정하는 기능이다.

    외래키 관계가 있을 때 부모 데이터 삭제로 인한 문제를 처리하기 위해 사용한다.

 

2) ON DELETE SET NULL

 

    (1) ON DELETE SET NULL의 역할

    ON DELETE SET NULL은 부모 테이블의 값이 삭제될 때, 자식 테이블의 외래키 값을 NULL로 바꾸는 옵션이다.

    참조하던 부모 값은 사라지지만 자식 데이터 자체는 유지된다.

 

    (2) 사용 상황

    회원 등급이 삭제되더라도 회원 정보는 남겨두고, 등급 정보만 비워두고 싶을 때 사용할 수 있다.

    참조 관계만 끊고 자식 데이터는 보존하는 방식이다.

 

3) ON DELETE CASCADE

 

    (1) ON DELETE CASCADE의 역할

    ON DELETE CASCADE는 부모 테이블의 값이 삭제될 때, 그 값을 참조하던 자식 데이터도 함께 삭제하는 옵션이다.

    부모 데이터와 관련된 자식 데이터를 함께 제거할 때 사용한다.

 

    (2) 사용 상황

    부모 데이터가 삭제되면 관련 자식 데이터도 더 이상 의미가 없을 때 사용할 수 있다.

    예를 들어 특정 등급이 삭제될 때 해당 등급을 가진 회원 데이터도 함께 삭제되도록 만들 수 있다.


8 서브쿼리를 활용한 테이블 생성

1) CREATE TABLE AS SELECT

 

    (1) CREATE TABLE AS SELECT의 역할

    CREATE TABLE AS SELECT는 SELECT 결과를 이용해 새 테이블을 만드는 방식이다.

    기존 테이블의 컬럼 구조와 데이터를 복사해서 새 테이블을 만들 수 있다.

 

    (2) 복사 가능한 내용

    서브쿼리로 테이블을 만들면 컬럼명, 데이터 타입, 값, NOT NULL 제약조건 일부를 복사할 수 있다.

    기존 테이블과 비슷한 구조의 테스트 테이블을 만들 때 유용하다.

 

2) 전체 복사

 

    (1) 전체 복사의 의미

    기존 테이블의 모든 컬럼과 모든 데이터를 새 테이블로 복사하는 방식이다.

    원본 테이블을 테스트용으로 복제하고 싶을 때 사용할 수 있다.

 

3) 구조만 복사

 

    (1) 구조만 복사의 의미

    WHERE 1=2 조건을 사용하면 항상 거짓이기 때문에 데이터는 복사되지 않는다.

    대신 컬럼 구조만 복사된 빈 테이블을 만들 수 있다.

 

    (2) 사용 상황

    원본과 같은 형식의 테이블은 필요하지만 데이터는 비워두고 싶을 때 사용한다.

    실습용 테이블이나 임시 저장 테이블을 만들 때 유용하다.

 

4) 특정 컬럼만 복사

 

    (1) 일부 컬럼 복사

    SELECT문에서 원하는 컬럼만 선택하면 해당 컬럼만 가진 새 테이블을 만들 수 있다.

    필요한 데이터만 따로 분리해서 관리하고 싶을 때 사용할 수 있다.

 

    (2) 별칭 적용

    SELECT절에서 별칭을 사용하면 새 테이블의 컬럼명이 별칭으로 생성될 수 있다.

    복사하면서 컬럼명을 보기 좋게 바꾸고 싶을 때 사용할 수 있다.


9 DEFAULT 값 설정

1) DEFAULT의 개념

 

    (1) DEFAULT의 역할

    DEFAULT는 INSERT할 때 값을 직접 넣지 않으면 자동으로 들어갈 기본값을 설정하는 기능이다.

    자주 사용하는 기본값이 있거나 값이 생략될 수 있는 컬럼에 사용한다.

 

    (2) 사용 상황

    상태값을 기본으로 설정하거나, 생성일자를 현재 날짜로 자동 입력하고 싶을 때 사용할 수 있다.

    예를 들어 날짜 컬럼에 DEFAULT SYSDATE를 설정하면 값이 없을 때 현재 날짜가 들어간다.

 

2) DEFAULT 사용

 

    (1) DEFAULT 키워드

    INSERT할 때 DEFAULT라고 작성하면 해당 컬럼에 설정된 기본값이 저장된다.

    직접 값을 넣지 않고 기본값을 사용하고 싶을 때 사용한다.

 

    (2) 기본값의 장점

    매번 같은 값을 직접 입력하지 않아도 되기 때문에 SQL 작성이 편해진다.

    누락된 값에 일정한 기본값을 자동으로 넣어 데이터 일관성을 유지할 수 있다.


10 ALTER TABLE

1) ALTER TABLE의 개념

 

    (1) ALTER TABLE의 역할

    ALTER TABLE은 이미 생성된 테이블의 구조를 수정하는 DDL 명령어이다.

    테이블 생성 후 제약조건을 추가하거나 컬럼 속성을 변경할 때 사용한다.

 

    (2) 사용 상황

    처음 테이블을 만들 때 제약조건을 설정하지 않았더라도, 나중에 ALTER TABLE을 사용해 제약조건을 추가할 수 있다.

    운영 중인 테이블의 규칙을 보완할 때 유용하다.

 

2) 제약조건 추가

 

    (1) PRIMARY KEY 추가

    ALTER TABLE을 사용해 기존 테이블에 기본키를 추가할 수 있다.

    특정 컬럼을 행의 식별 기준으로 만들 때 사용한다.

 

    (2) FOREIGN KEY 추가

    기존 테이블의 컬럼이 다른 테이블을 참조하도록 외래키를 추가할 수 있다.

    테이블 사이의 관계를 나중에 설정할 수 있다.

 

    (3) UNIQUE 추가

    특정 컬럼에 중복값이 들어가지 않도록 UNIQUE 제약조건을 추가할 수 있다.

    사원번호나 주민등록번호처럼 고유해야 하는 값에 사용할 수 있다.

 

    (4) CHECK 추가

    특정 컬럼에 저장 가능한 값의 조건을 추가할 수 있다.

    급여가 0보다 커야 한다거나, 퇴사 여부가 Y 또는 N이어야 한다는 규칙을 설정할 수 있다.

 

    (5) NOT NULL 추가

    MODIFY를 사용해 기존 컬럼에 NOT NULL 제약조건을 추가할 수 있다.

    단, 이미 NULL 값이 들어있는 경우에는 먼저 데이터를 정리해야 한다.

 

3) 제약조건 삭제

 

    (1) DROP CONSTRAINT

    ALTER TABLE에서 DROP CONSTRAINT를 사용하면 기존 제약조건을 삭제할 수 있다.

    제약조건을 삭제하려면 해당 제약조건의 이름을 알고 있어야 한다.

 

    (2) 제약조건 이름 확인

    USER_CONSTRAINTS와 USER_CONS_COLUMNS를 조회하면 테이블에 설정된 제약조건 이름과 컬럼 정보를 확인할 수 있다.

    제약조건을 관리할 때 데이터 사전을 함께 활용한다.


11 DML과 INSERT

1) DML의 개념

 

    (1) DML의 역할

    DML은 테이블 안의 데이터를 조작하는 SQL 명령어이다.

    데이터를 추가, 수정, 삭제, 조회할 때 사용한다.

 

    (2) INSERT

    INSERT는 테이블에 새로운 행을 추가하는 명령어이다.

    회원이나 사원처럼 새로운 데이터를 저장할 때 사용한다.

 

    (3) UPDATE

    UPDATE는 기존 데이터를 수정하는 명령어이다.

    이미 저장된 값이 변경되었을 때 사용한다.

 

    (4) DELETE

    DELETE는 기존 데이터를 삭제하는 명령어이다.

    필요 없는 행을 제거할 때 사용한다.

 

    (5) SELECT

    SELECT는 데이터를 조회하는 명령어이다.

    DQL로 따로 구분하기도 하지만, CRUD의 READ에 해당한다.

 

2) INSERT 기본 형식

 

    (1) 특정 컬럼에 값 추가

    INSERT INTO 테이블명 뒤에 컬럼명을 직접 작성하면, 지정한 컬럼에만 값을 넣을 수 있다.

    모든 컬럼에 값을 넣지 않아도 될 때 사용한다.

 

    (2) 모든 컬럼에 값 추가

    컬럼명을 생략하면 테이블에 정의된 모든 컬럼 순서대로 값을 넣어야 한다.

    컬럼 순서와 값의 순서가 정확히 맞아야 하므로 주의가 필요하다.

 

3) COMMIT

 

    (1) COMMIT의 역할

    COMMIT은 지금까지 변경한 내용을 데이터베이스에 확정 저장하는 명령어이다.

    INSERT, UPDATE, DELETE 작업 후 변경사항을 실제로 반영할 때 사용한다.

 

    (2) COMMIT을 사용하는 이유

    데이터 변경 작업은 실수할 수 있기 때문에 바로 확정하지 않고 트랜잭션 단위로 관리한다.

    COMMIT을 실행하면 변경 내용이 최종 저장된다.


12 INSERT와 서브쿼리

1) INSERT SELECT

 

    (1) INSERT SELECT의 역할

    INSERT SELECT는 SELECT로 조회한 결과를 다른 테이블에 한 번에 추가하는 방식이다.

    여러 행의 데이터를 직접 하나씩 입력하지 않고 조회 결과를 그대로 저장할 수 있다.

 

    (2) 사용 상황

    EMPLOYEE에서 특정 부서 직원만 조회해 EMP_DEPT_D1 같은 별도 테이블에 저장할 때 사용할 수 있다.

    조건에 맞는 데이터를 복사하거나 백업 테이블을 만들 때 유용하다.

 

2) 빈 테이블 생성 후 데이터 추가

 

    (1) 구조만 먼저 만들기

    CREATE TABLE AS SELECT와 WHERE 1=2를 사용하면 데이터 없이 구조만 가진 빈 테이블을 만들 수 있다.

    이후 INSERT SELECT를 사용해 원하는 데이터만 추가할 수 있다.

 

    (2) 특정 부서 데이터 추가

    EMPLOYEE 테이블에서 DEPT_CODE가 D1인 사원만 조회해 EMP_DEPT_D1 테이블에 추가할 수 있다.

    필요한 데이터만 분리해서 저장하고 싶을 사용한다.