개발 지식/[DBMS] Oracle

[Oracle] 제약 조건(1) - 제약 조건(CONSTRAINT) 제어, NOT NULL

devGSP 2022. 6. 23. 08:00
반응형
이 게시물은 Database GUI Oracle SQL Developer의 아래 버전 정보를 기준으로 작성되었습니다.

Java(TM) 플랫폼 : 1.8.0_321
Oracle IDE : 4.1.5.21.78

 

제약 조건(CONSTRAINT) 제어, NOT NULL

 

설명

 

제약 조건(constraint) : 테이블에 저장할 데이터를 제약하는 특수한 규칙. 종류로는 NOT NULL, UNIQUE, PRIMARY KEY , FOREIGN KEY, CHECK가 있음

NOT NULL : 지정한 열에 NULL을 허용하지 않는 제약 조건. NULL을 제외한 데이터의 중복은 허용됨.

 

 

제약 조건 제어 문법

 

제약 조건 조회하기

 

SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
    FROM USER_CONSTRAINTS;

 

OWNER : 제약 조건 소유 계정
CONSTRAINT_NAME : 제약 조건 이름(지정하지 않을 경우 오라클에서 자동으로 지정)
CONSTRAINT_TYPE : 제약 조건 종류(C : CHECK, NOT NULL / U : UNIQUE / P : PRIMARY KEY / R : FOREIGN KEY)
TABLE_NAME : 제약 조건을 지정한 테이블 이름

 

 

테이블 생성 시(1)

 

CREATE TABLE [테이블명] (
  [열이름1] [자료형1] [제약조건1(선택)],
  [열이름2] [자료형2] [제약조건2(선택)],

           ...
  [열이름n] [자료형n] [제약조건n(선택)]
);

 

 

테이블 생성 시(2) - 제약 조건의 이름을 직접 지정함

 

CREATE TABLE [테이블명] (
  [열이름1] [자료형1] CONSTRAINT [제약조건명1(선택)] [제약조건1(선택)],
  [열이름2] [자료형2] CONSTRAINT [제약조건명2(선택)] [제약조건2(선택)],

           ...
  [열이름n] [자료형n] CONSTRAINT [제약조건명n(선택)] [제약조건n(선택)]
);

 

 

테이블 구조 수정 시

 

ALTER TABLE [테이블명] MODIFY([컬럼명] [제약조건]);

 

 

제약 조건 이름 변경 시

 

ALTER TABLE [테이블명] RENAME CONSTRAINT [기존 제약 조건 이름] TO [바꿀제약 조건 이름];

 

 

제약 조건 삭제 시

 

ALTER TABLE [테이블명] DROP CONSTRAINT [제약 조건 이름];

 

 

사용 예시

 

제약 조건 테이블 생성 및 제약 조건 조회

 

-- NOT NULL 제약 조건을 걸어 테이블 생성
CREATE TABLE TB_NOTNULL (
  COL_IDX NUMBER(3) NOT NULL,
  COL_NAME VARCHAR2(20) NOT NULL,
  COL_BIRTH DATE,
  TEL VARCHAR2(20)
);

DESC TB_NOTNULL;

const_q1

 

-- 제약 조건 정보 조회
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS;

const_q2

 

-- 제약 조건 이름을 지정하여 테이블 생성
CREATE TABLE TB_NOTNULL2 (
  COL_IDX NUMBER(3) CONSTRAINT TEST_CONSTRAINT1 NOT NULL,
  COL_NAME VARCHAR2(20) CONSTRAINT TEST_CONSTRAINT2 NOT NULL,
  COL_BIRTH DATE,
  COL_TEL VARCHAR2(20)
);

-- 제약 조건 정보 조회
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS;

const_q3

 

 

제약 조건 테이블에 INSERT 테스트

 

INSERT INTO TB_NOTNULL (COL_IDX, COL_NAME, COL_BIRTH, COL_TEL)
     VALUES ('101', 'KYUNGWAN', TO_DATE('1990/10/31', 'YYYY/MM/DD'), '010-1234-5678');
     
SELECT * FROM TB_NOTNULL;

const_q4

 

-- COL_IDX열에 NULL 삽입
INSERT INTO TB_NOTNULL (COL_IDX, COL_NAME, COL_BIRTH, COL_TEL)
     VALUES (NULL, 'KYUNGWAN', TO_DATE('1990/10/31', 'YYYY/MM/DD'), '010-1234-5678');
 
-- NOT NULL 제약 조건 열을 명시하지 않고 INSERT 실행
INSERT INTO TB_NOTNULL (COL_BIRTH, COL_TEL)
     VALUES (TO_DATE('1990/10/31', 'YYYY/MM/DD'), '010-1234-5678');

const_q5

 

NOT NULL 제약 조건이 걸린 열에 NULL 데이터 삽입을 유도하니 오류가 발생한다.

 

 

제약 조건 테이블에 INSERT 테스트

 

-- COL_BIRTH열이 NULL인 추가 데이터 삽입
INSERT INTO TB_NOTNULL (COL_IDX, COL_NAME, COL_BIRTH, COL_TEL)
     VALUES ('102', 'SEOKHWAN', NULL, '010-5678-1234');

SELECT * FROM TB_NOTNULL;

const_q6

 

-- COL_BIRTH열에 NOT NULL 제약 조건 추가
ALTER TABLE TB_NOTNULL MODIFY(COL_BIRTH NOT NULL);

const_q7

 

COL_BIRTH열에 이미 NULL 데이터가 들어가 있으므로 NOT NULL 제약 조건이 추가되지 않음.

 

-- UPDATE 후 다시 시도
UPDATE TB_NOTNULL
   SET COL_BIRTH = TO_DATE('1997/07/28', 'YYYY/MM/DD')
 WHERE COL_NAME = 'SEOKHWAN';
 
SELECT * FROM TB_NOTNULL;

ALTER TABLE TB_NOTNULL MODIFY(COL_BIRTH NOT NULL);

const_q8

 

제약 조건 추가 후 COL_BIRTH가 NULL인 데이터 INSERT를 실행

 

-- 제약 조건 설정 후 COL_BIRTH열이 NULL인 추가 데이터 삽입
INSERT INTO TB_NOTNULL (COL_IDX, COL_NAME, COL_BIRTH, COL_TEL)
     VALUES ('103', 'HAEJUNE', NULL, '010-1111-2222');

const_q9

 

NOT NULL 제약 조건에 의해 오류 발생

 

 

제약 조건 이름 변경

 

-- 제약 조건 조회
SELECT OWNER, CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
  FROM USER_CONSTRAINTS;

const_q10

 

맨 아래에 'SYS_C007077'인 제약 조건 이름을 변경해 보자.

(따라서 해 보는 분들은 반드시 자기 화면에 출력되는 제약 조건 이름을 사용하도록 하자)

 

ALTER TABLE TB_NOTNULL RENAME CONSTRAINT SYS_C007077 TO BABO

const_q11

 

 

제약 조건 이름 변경

 

이름을 저따구로 해 놓은 걸 선임에게 들키면 죽을 수도 있으니 얼른 삭제해 보자.

 

ALTER TABLE TB_NOTNULL DROP CONSTRAINT BABO;

const_q12

 

반응형