본문 바로가기
SQL/개념

10. 제약 조건

by Merware 2023. 5. 9.

01. 제약 조건 종류

1. NOT NULL - 값이 없는 것을 허용 안함

2. UNIQUE - 중복 허용 안함

3. PK(PRIMARY KEY) - 한 로를 대표하는 유일한 키(컬럼-1, 2개 이상)

- INDEX 자동 생성

- NOT NULL 자동 생성

4. FK(FOREIGN KEY) - 다른 테이블을 참조하는 키(EMP.DEPTNO => DEPT.DEPTNO)

5. CHECK

- 컬럼에 조건을 줘서 입력 값이 조건에 만족해야 하는 것

- 조건 만족X 에러

6. DEFAULT

- 컬럼에 입력 값이 없을 때 자동적으로 어떤 값을 집어 입력하는 것

제약 조건 확인

  • USER_CONSTRINTS

열 이름 설명

OWNER 제약 조건 소유 계정
CONSTRAINT_NAME 제약 조건 이름(직접 지정하지 않을 경우 오라클이 자동으로 지정함)
CONSTRAINT_TYPE 제약 조건 종류C : CHECK, NOT NULLU : UNIQUEP : PRIMARY KEYR : FOREIGN KEY
TABLE_NAME 제약 조건을 지정한 테이블 이름

1. NOT NULL

테이블 생성할 때  NOT NULL 설정하기

-- 실습 14-1
CREATE TABLE TABLE_NOTNULL(
   LOGIN_ID VARCHAR2(20) NOT NULL,
   LOGIN_PWD VARCHAR2(20) NOT NULL,
   TEL VARCHAR2(20)
);

DESC TABLE_NOTNULL;

제약 조건이 NOT NULL인 열에 NULL 값 넣어보기

-- 실습 14-2
INSERT INTO TABLE_NOTNULL (LOGIN_ID, LOGIN_PWD, TEL)
VALUES ('TEST_ID_01', NULL, '010-1234-5678');

# 에러

NOT NULL 제약 조건이 지정된 열 데이터를 NULL 값으로 업데이트하기

-- 실습 14-4
UPDATE TABLE_NOTNULL
   SET LOGIN_PWD = NULL
 WHERE LOGIN_ID = 'TEST_ID_01';

# 에러

테이블을 생성할 때 제약 조건에 이름 지정하기

-- 실습 14-6
CREATE TABLE TABLE_NOTNULL2(
   LOGIN_ID VARCHAR2(20) CONSTRAINT TBLNN2_LGNID_NN NOT NULL,
   LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLNN2_LGNPW_NN NOT NULL,
   TEL VARCHAR2(20)
);

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
  WHERE TABLE_NAME = 'TABLE_NOTNULL2';

TEL 열에 NOT NULL 제약 조건 추가하기

-- 실습 14-7
ALTER TABLE TABLE_NOTNULL
MODIFY(TEL NOT NULL);

SELECT * FROM TABLE_NOTNULL;

DESC TABLE_NOTNULL;

TEL 열 데이터 수정하기

-- 실습 14-8
UPDATE TABLE_NOTNULL
   SET TEL = '010-1234-5678'
 WHERE LOGIN_ID = 'TEST_ID_01';

SELECT * FROM TABLE_NOTNULL;

NOT NULL 제약 조건 추가하기

-- 실습 14-9
ALTER TABLE TABLE_NOTNULL
MODIFY(TEL NOT NULL);

DESC TABLE_NOTNULL;

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
 WHERE TABLE_NAME = 'TABLE_NOTNULL';

제약 조건에 이름 지정해서 추가하기

-- 실습 14-10
DESC TABLE_NOTNULL2

SELECT * FROM TABLE_NOTNULL2;

ALTER TABLE TABLE_NOTNULL2
MODIFY(TEL CONSTRAINT TBLNN_TEL_NN NOT NULL);

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
  WHERE TABLE_NAME = 'TABLE_NOTNULL2';

TABLE_NOTNULL2 테이블 열 구조 확인하기

-- 실습 14-11
DESC TABLE_NOTNULL2;

이미 생성된 제약 조건 이름 변경하기

-- 실습 14-12
ALTER TABLE TABLE_NOTNULL2
RENAME CONSTRAINT TBLNN_TEL_NN TO TBLNN2_TEL_NN;

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
   WHERE TABLE_NAME = 'TABLE_NOTNULL2';

제약 조건 삭제하기

-- 실습 14-13
ALTER TABLE TABLE_NOTNULL2
 DROP CONSTRAINT TBLNN2_TEL_NN;

DESC TABLE_NOTNULL2;

2. UNIQUE

제약 조건 지정하기

-- 실습 14-14
CREATE TABLE TABLE_UNIQUE(
   LOGIN_ID VARCHAR2(20) UNIQUE,
   LOGIN_PWD VARCHAR2(20) NOT NULL,
   TEL VARCHAR2(20)
);

DESC TABLE_UNIQUE;

TABLE_UNIQUE 테이블에 데이터 입력하기

-- 실습 14-16
INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL)
VALUES('TEST_ID_01', 'PWD01', '010-1234-5678');

SELECT * FROM TABLE_UNIQUE;

LOGIN_ID열에 중복되는 데이터 넣기

-- 실습 14-17
INSERT INTO TABLE_UNIQUE (LOGIN_ID, LOGIN_PWD, TEL)
VALUES ('TEST_ID_01', 'PWD01', '010-1234-5678');

TABLE_UNIQUE 테이블에 데이터 입력하기

-- 실습 14-18
INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL)
VALUES('TEST_ID_02', 'PWD01', '010-1234-5678');

SELECT * FROM TABLE_UNIQUE;

UNIQUE 제약 조건이 지정된 열에  NULL 값 입력하기

-- 실습 14-19
INSERT INTO TABLE_UNIQUE(LOGIN_ID, LOGIN_PWD, TEL)
VALUES(NULL, 'PWD01', '010-2345-6789');

SELECT * FROM TABLE_UNIQUE;

TABLE_UNIQUE 테이블 데이터 수정하기

-- 실습 14-20
UPDATE TABLE_UNIQUE
   SET LOGIN_ID='TEST_ID_01'
 WHERE LOGIN_ID IS NULL;

이미 생성한 테이블 열에 UNIQUE 제약 조건 추가하기

-- 실습 14-23
ALTER TABLE TABLE_UNIQUE
MODIFY(TEL UNIQUE);

SELECT * FROM TABLE_UNIQUE;

TEL 열 값을 모두 NULL 값으로 변경하기

-- 실습 14-24
UPDATE TABLE_UNIQUE
   SET TEL = NULL;

SELECT * FROM TABLE_UNIQUE;

TEL 값에 UNIQUE 제약 조건 설정하기

-- 실습 14-25
ALTER TABLE TABLE_UNIQUE
MODIFY(TEL UNIQUE);

UNIQUE 제약 조건 이름 직접 지정하기

-- 실습 14-26
ALTER TABLE TABLE_UNIQUE2
MODIFY(TEL CONSTRAINT TBLUNQ_TEL_UNQ UNIQUE);

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
 WHERE TABLE_NAME LIKE 'TABLE_UNIQUE%';

이미 만들어져 있는 UNIQUE 제약 조건 이름 수정하기

-- 실습 14-27
ALTER TABLE TABLE_UNIQUE2
RENAME CONSTRAINT TBLUNQ_TEL_UNQ TO TBLUNQ2_TEL_UNQ;

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
 WHERE TABLE_NAME LIKE 'TABLE_UNIQUE%';

제약 조건 삭제하기

-- 실습 14-28
ALTER TABLE TABLE_UNIQUE2
 DROP CONSTRAINT TBLUNQ2_TEL_UNQ;

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
 WHERE TABLE_NAME LIKE 'TABLE_UNIQUE%';

3. USER_CONSTRAINTS

데이터 사전 뷰로 제약 조건 확인하기

-- 실습 14-15
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
 WHERE TABLE_NAME = 'TABLE_UNIQUE';

4. PRIMARY KEY

테이블을 생성할 때 특정 열에 PRIMARY KEY 설정하기

-- 실습 14-29
CREATE TABLE TABLE_PK(
   LOGIN_ID VARCHAR2(20) PRIMARY KEY,
   LOGIN_PWD VARCHAR2(20) NOT NULL,
   TEL VARCHAR2(20)
);

DESC TABLE_PK;

생성한 PRIMARY KEY 확인하기

-- 실습 14-30
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
 WHERE TABLE_NAME LIKE 'TABLE_PK%';

생성한 PRIMARY KEY를 통해 자동 생성된 INDEX 확인하기

-- 실습 14-31
SELECT INDEX_NAME, TABLE_OWNER, TABLE_NAME
  FROM USER_INDEXES
 WHERE TABLE_NAME LIKE 'TABLE_PK%';

제약 조건의 이름을 직접 지정하여 테이블 생성하기

-- 실습 14-32
CREATE TABLE TABLE_PK2(
   LOGIN_ID VARCHAR2(20) CONSTRAINT TBLPK2_LGNID_PK PRIMARY KEY,
   LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLPK2_LGNPW_NN NOT NULL,
   TEL VARCHAR2(20)
);

DESC TABLE_PK2;

TABLE_PK 테이블에 데이터 입력하기

-- 실습 14-33
INSERT INTO TABLE_PK(LOGIN_ID, LOGIN_PWD, TEL)
VALUES('TEST_ID_01', 'PWD01', '010-1234-5678');

SELECT * FROM TABLE_PK;

TABLE_PK 테이블에 중복되는 데이터 입력하기

-- 실습 14-34
INSERT INTO TABLE_PK(LOGIN_ID, LOGIN_PWD, TEL)
VALUES('TEST_ID_01', 'PWD02', '010-2345-6789');


5. FOREIGN KEY

EMP 테이블과 DEPT 테이블의 제약 조건 살펴보기

-- 실습 14-37SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME, R_OWNER, R_CONSTRAINT_NAME
  FROM USER_CONSTRAINTS
 WHERE TABLE_NAME IN ('EMP', 'DEPT');

FOREGIN KEY가 참조하는 열에 존재하지 않는 데이터 입력하기

-- 실습 14-38
INSERT INTO EMP(EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO)
VALUES(9999, '홍길동', 'CLERK', '7788', TO_DATE('2017/04/30', 'YYYY/MM/DD'), 1200, NULL, 50);

DEPT_FK 테이블 생성하기

-- 실습 14-39
CREATE TABLE DEPT_FK(
   DEPTNO NUMBER(2) CONSTRAINT DEPTFK_DEPTNO_PK PRIMARY KEY,
   DNAME VARCHAR2(14),
   LOC VARCHAR2(13)
);

DESC DEPT_FK;

EMP_FK 테이블 생성하기

-- 실습 14-40
CREATE TABLE EMP_FK(
   EMPNO NUMBER(4) CONSTRAINT EMPFK_EMPNO_PK PRIMARY KEY,
   ENAME VARCHAR2(10),
   JOB VARCHAR2(9),
   MGR NUMBER(4),
   HIREDATE DATE,
   SAL NUMBER(7,2),
   COMM NUMBER(7,2),
   DEPTNO NUMBER(2) CONSTRAINT EMPFK_DEPTNO_FK REFERENCES DEPT_FK (DEPTNO)
);

DESC EMP_FK;

EMP_FK 테이블에 데이터 삽입하기(DEPTNO 데이터가 아직 DEPT_FK 테이블에 없을 때)

-- 실습 14-41INSERT INTO EMP_FK
VALUES(9999, 'TEST_NMAME', 'TEST_JOB', NULL, TO_DATE('2001/01/01', 'YYYY/MM/DD'),
       3000, NULL, 10);

DEPT_FK에 데이터 삽입하기

-- 실습 14-42INSERT INTO DEPT_FK
VALUES(10, 'TEST_DNAME', 'TEST_LOC');

SELECT * FROM DEPT_FK;

EMP_FK 테이블에 데이터 삽입하기

-- 실습 14-43INSERT INTO EMP_FK
VALUES(9999, 'TEST_NMAME', 'TEST_JOB', NULL, TO_DATE('2001/01/01', 'YYYY/MM/DD'),
       3000, NULL, 10);

SELECT * FROM EMP_FK;

DEPT_FK 테이블의 10번 부서 데이터 삭제하기

-- 실습 14-44DELETE FROM DEPT_FK
 WHERE DEPTNO = 10;

# 에러

6. CHECK

테이블을 생성할 때 CHECK 제약 조건 설정하기

-- 실습 14-45
CREATE TABLE TABLE_CHECK(
   LOGIN_ID VARCHAR2(20) CONSTRAINT TBLCK_LOGINID_PK PRIMARY KEY,
   LOGIN_PWD VARCHAR2(20) CONSTRAINT TBLCK_LOGINPW_CK CHECK (LENGTH(LOGIN_PWD) > 3),
   TEL VARCHAR2(20)
);

DESC TABLE_CHECK;

CHECK 제약 조건에 맞지 않는 예

-- 실습 14-46
INSERT INTO TABLE_CHECK
VALUES ('TEST_ID', '123', '010-1234-5678');

# 에러

CHECK 제약 조건에 맞는 예

-- 실습 14-47
INSERT INTO TABLE_CHECK
VALUES ('TEST_ID', '1234', '010-1234-5678');

SELECT * FROM TABLE_CHECK;

CHECK 제약 조건 확인하기

-- 실습 14-48
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS
 WHERE TABLE_NAME LIKE 'TABLE_CHECK';

7. DEFAULT

테이블을 생성할 때 DEFAULT 제약 조건 설정하기

-- 실습 14-49
CREATE TABLE TABLE_DEFAULT(
   LOGIN_ID VARCHAR2(20) CONSTRAINT TBLCK2_LOGINID_PK PRIMARY KEY,
   LOGIN_PWD VARCHAR2(20) DEFAULT '1234',
   TEL VARCHAR2(20)
);

		DESC TABLE_DEFAULT;

DEFAULT로 지정한 기본값이 입력되는 INSERT문 확인하기

-- 실습 14-50
INSERT INTO TABLE_DEFAULT VALUES ('TEST_ID', NULL, '010-1234-5678');

INSERT INTO TABLE_DEFAULT (LOGIN_ID, TEL) VALUES ('TEST_ID2', '010-1234-5678');

SELECT * FROM TABLE_DEFAULT;

'SQL > 개념' 카테고리의 다른 글

11. 사용자, 권한, 롤 관리  (0) 2023.05.09
09. 객체 종류  (0) 2023.05.09
08. 데이터 정의어(DDL)  (0) 2023.05.09
07. 트랜잭션 제어와 세션(TCL)  (0) 2023.05.09
06. 데이터 조작어(DML)  (0) 2023.05.08