공든탑앱 열기

제약조건

SQLD (SQL 개발자) · 관리 구문 · 약 14분

쉽게 말하면

제약조건은 표에 잘못된 값이 못 들어오게 막는 규칙이에요. 회원 가입 양식처럼 아이디는 겹치거나 비면 안 되고(PRIMARY KEY), 이메일은 겹치면 안 되고(UNIQUE), 이름은 꼭 써야 하고(NOT NULL), 나이는 0 이상이어야 해요(CHECK). 규칙을 어기는 입력은 오류로 거부돼요.

시험용 정의

제약조건(Constraint)은 테이블에 잘못된 데이터가 들어오지 못하게 막는 규칙이다. PRIMARY KEY(중복·NULL 불가, 테이블당 하나), UNIQUE(중복 불가, NULL 허용), NOT NULL(NULL 불가), CHECK(조건식을 만족해야 함), FOREIGN KEY(다른 테이블의 PK에 있는 값만 허용, 참조 무결성). 어기는 INSERT·UPDATE·DELETE는 오류로 거부된다.

비유로 이해하기

회원 가입 양식의 검사 규칙이다. 아이디는 겹치면 안 되고 비워도 안 되며(PK), 이메일은 겹치면 안 되고(UNIQUE), 이름은 꼭 쓰고(NOT NULL), 나이는 0 이상(CHECK), 추천인은 실제 회원이어야 한다(FK).

자세히

먼저 알아 둘 말

말뜻
무결성데이터가 정확하고 일관된 상태. 개체 무결성(PK), 참조 무결성(FK), 도메인 무결성(CHECK·형)
부모 / 자식 테이블FK에서 참조당하는 쪽(DEPT) / 참조하는 쪽(EMP)
ORA-02290 / 02291 / 02292CHECK 위반 / 부모 키 없음 / 자식 레코드 있음
STUDENT미션에서 직접 만들 연습용 테이블

다섯 가지 제약

제약중복NULL메모
PRIMARY KEY불가불가테이블당 하나(복합키 가능). 자동으로 인덱스가 생긴다
UNIQUE불가허용여러 개 둘 수 있다
NOT NULL허용불가열 단위로만 정의 (CTAS로도 복사됨)
CHECK--조건이 거짓이면 거부. NULL은 통과(알 수 없음은 거짓이 아님)
FOREIGN KEY허용허용부모 PK·UNIQUE에 있는 값이나 NULL만

참조 동작 (부모 행을 지울 때)

옵션동작
(기본, NO ACTION / RESTRICT)자식이 있으면 부모 삭제를 거부 (ORA-02292)
ON DELETE CASCADE부모를 지우면 자식도 함께 삭제
ON DELETE SET NULL부모를 지우면 자식의 FK를 NULL로
SET DEFAULT (SQL Server)자식 FK를 기본값으로

정의하는 방법

  • 열 옆에(열 수준): id NUMBER PRIMARY KEY, name VARCHAR2(20) NOT NULL
  • 열 정의 뒤에(테이블 수준): CONSTRAINT stu_pk PRIMARY KEY (sno), 복합키는 이렇게만 가능
  • 나중에 추가: ALTER TABLE t ADD CONSTRAINT 이름 UNIQUE (email), 삭제: ALTER TABLE t DROP CONSTRAINT 이름
  • 이름을 주지 않으면 DBMS가 SYS_C… 같은 이름을 붙인다

시험에 이렇게 나와요

출제 범위·공식 안내 기반

확인 문제

Q1. UNIQUE 제약이 걸린 EMAIL 열에 NULL을 두 번 넣으면?

  1. 첫 번째부터 오류
  2. 두 번째에서 중복 오류
  3. NULL이 빈 문자열로 바뀐다
  4. 둘 다 들어간다
정답 보기

4번 둘 다 들어간다

UNIQUE는 값이 있는 것끼리의 중복만 막는다. NULL은 '값이 없음'이라 서로 같다고 보지 않아 여러 개 들어갈 수 있다. NULL을 막으려면 NOT NULL을 함께 건다. PRIMARY KEY는 UNIQUE + NOT NULL이다.

Q2. PRIMARY KEY에 대한 설명으로 틀린 것은?

  1. NULL을 허용하지 않는다
  2. 한 테이블에 여러 개 만들 수 있다
  3. 중복을 허용하지 않는다
  4. 여러 열을 묶어 만들 수 있다
정답 보기

2번 한 테이블에 여러 개 만들 수 있다

PK는 테이블당 하나. 여러 열 묶음(복합키)은 가능.

Q3. EMP.DEPTNO가 DEPT.DEPTNO를 ON DELETE CASCADE로 참조한다. DELETE FROM dept WHERE deptno = 20을 하면?

  1. 사원의 DEPTNO가 NULL이 된다
  2. 오류가 난다
  3. 부서만 삭제되고 사원은 그대로
  4. 20번 부서와 그 부서 사원이 함께 삭제된다
정답 보기

4번 20번 부서와 그 부서 사원이 함께 삭제된다

CASCADE는 자식도 함께 삭제. SET NULL이었다면 3번.

Q4. CHECK (sal > 0) 제약이 있는 열에 NULL을 넣으면?

  1. 오류
  2. 들어간다
  3. 경고 후 거부
  4. 0으로 바뀐다
정답 보기

2번 들어간다

NULL > 0은 알 수 없음이고, CHECK는 거짓일 때만 거부한다.

Q5. PRIMARY KEY와 UNIQUE의 차이로 옳은 것은?

  1. UNIQUE는 테이블당 하나만 만들 수 있다
  2. PK는 NULL을 허용하지 않고, UNIQUE는 NULL을 허용한다
  3. 둘 다 NULL을 허용한다
  4. PK는 테이블당 여러 개 만들 수 있다
정답 보기

2번 PK는 NULL을 허용하지 않고, UNIQUE는 NULL을 허용한다

PK는 UNIQUE + NOT NULL이고 테이블당 하나다.

Q6. 외래키에 ON DELETE SET NULL을 주고 부모 행을 지우면 자식 행은?

  1. 함께 지워진다
  2. 외래키 열이 NULL이 된다
  3. 삭제가 거부된다
  4. 아무 변화가 없다
정답 보기

2번 외래키 열이 NULL이 된다

함께 지우는 것은 ON DELETE CASCADE, 기본 동작은 삭제 거부다.

헷갈리기 쉬운 O·X

UNIQUE 제약이 걸린 열에는 NULL을 여러 번 넣을 수 있다.

정답 보기

O NULL끼리는 같은 값으로 보지 않는다.

외래키 열에는 NULL을 넣을 수 없다.

정답 보기

X NOT NULL이 없다면 FK 열에 NULL이 들어갈 수 있다.

자식 행이 있는 부모 행은 기본 설정에서 삭제할 수 없다.

정답 보기

O ORA-02292. CASCADE나 SET NULL을 지정해야 한다.

함께 보면 좋은 개념