제약조건
쉽게 말하면
제약조건은 표에 잘못된 값이 못 들어오게 막는 규칙이에요. 회원 가입 양식처럼 아이디는 겹치거나 비면 안 되고(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 / 02292 | CHECK 위반 / 부모 키 없음 / 자식 레코드 있음 |
| 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… 같은 이름을 붙인다
시험에 이렇게 나와요
- PK = UNIQUE + NOT NULL, 테이블당 하나 / UNIQUE는 NULL 허용
- CHECK·FK에 NULL은 통과
- ON DELETE CASCADE·SET NULL과 기본 동작(자식 있으면 삭제 거부)
- 제약조건 위반 INSERT·DELETE 결과 고르기
- CTAS로는 NOT NULL만 복사
출제 범위·공식 안내 기반
확인 문제
Q1. UNIQUE 제약이 걸린 EMAIL 열에 NULL을 두 번 넣으면?
- 첫 번째부터 오류
- 두 번째에서 중복 오류
- NULL이 빈 문자열로 바뀐다
- 둘 다 들어간다
정답 보기
4번 둘 다 들어간다
UNIQUE는 값이 있는 것끼리의 중복만 막는다. NULL은 '값이 없음'이라 서로 같다고 보지 않아 여러 개 들어갈 수 있다. NULL을 막으려면 NOT NULL을 함께 건다. PRIMARY KEY는 UNIQUE + NOT NULL이다.
Q2. PRIMARY KEY에 대한 설명으로 틀린 것은?
- NULL을 허용하지 않는다
- 한 테이블에 여러 개 만들 수 있다
- 중복을 허용하지 않는다
- 여러 열을 묶어 만들 수 있다
정답 보기
2번 한 테이블에 여러 개 만들 수 있다
PK는 테이블당 하나. 여러 열 묶음(복합키)은 가능.
Q3. EMP.DEPTNO가 DEPT.DEPTNO를 ON DELETE CASCADE로 참조한다. DELETE FROM dept WHERE deptno = 20을 하면?
- 사원의 DEPTNO가 NULL이 된다
- 오류가 난다
- 부서만 삭제되고 사원은 그대로
- 20번 부서와 그 부서 사원이 함께 삭제된다
정답 보기
4번 20번 부서와 그 부서 사원이 함께 삭제된다
CASCADE는 자식도 함께 삭제. SET NULL이었다면 3번.
Q4. CHECK (sal > 0) 제약이 있는 열에 NULL을 넣으면?
- 오류
- 들어간다
- 경고 후 거부
- 0으로 바뀐다
정답 보기
2번 들어간다
NULL > 0은 알 수 없음이고, CHECK는 거짓일 때만 거부한다.
Q5. PRIMARY KEY와 UNIQUE의 차이로 옳은 것은?
- UNIQUE는 테이블당 하나만 만들 수 있다
- PK는 NULL을 허용하지 않고, UNIQUE는 NULL을 허용한다
- 둘 다 NULL을 허용한다
- PK는 테이블당 여러 개 만들 수 있다
정답 보기
2번 PK는 NULL을 허용하지 않고, UNIQUE는 NULL을 허용한다
PK는 UNIQUE + NOT NULL이고 테이블당 하나다.
Q6. 외래키에 ON DELETE SET NULL을 주고 부모 행을 지우면 자식 행은?
- 함께 지워진다
- 외래키 열이 NULL이 된다
- 삭제가 거부된다
- 아무 변화가 없다
정답 보기
2번 외래키 열이 NULL이 된다
함께 지우는 것은 ON DELETE CASCADE, 기본 동작은 삭제 거부다.
헷갈리기 쉬운 O·X
UNIQUE 제약이 걸린 열에는 NULL을 여러 번 넣을 수 있다.
정답 보기
O NULL끼리는 같은 값으로 보지 않는다.
외래키 열에는 NULL을 넣을 수 없다.
정답 보기
X NOT NULL이 없다면 FK 열에 NULL이 들어갈 수 있다.
자식 행이 있는 부모 행은 기본 설정에서 삭제할 수 없다.
정답 보기
O ORA-02292. CASCADE나 SET NULL을 지정해야 한다.