고래씌

[Oracle] 6-2. DDL(CREATE) - DDL 계정 ② (INSERT, 제약 조건) 본문

Database/Oracle

[Oracle] 6-2. DDL(CREATE) - DDL 계정 ② (INSERT, 제약 조건)

고래씌 2023. 11. 28. 15:53

1. INSERT (DML문)

: 데이터 추가시에는 한행으로 추가, 추가할 값을 기술
INSERT INTO 테이블명 VALUES(첫번째칼럼의 값, 두번째 칼럼의 값 ...);

 

▶ MEMBER 테이블에 칼럼값 추가

 

☞ 하지만,,,,!!!!! 아래와 같은 문제들이 존재할 수 있다.

INSERT INTO MEMBER VALUES(NULL, NULL, NULL, SYSDATE);

=> 아이디, 비번, 이름에 NULL값이 존재해도 되는가? 절대아님!!

 

 

INSERT INTO MEMBER VALUES('user03','pass03','이말똥', SYSDATE);

=> 중복된 아이디가 존재해도 되나? 절대아님!

 

☞ 위의 NULL값들이나 중복된 아이디값은 유효한 데이터가 아님.
유효한 데이터값을 유지하기 위해서는 "제약조건"을 걸어줘야한다.

 

 

 

제약 조건 CONSTRAINTS

- 특정 칼럼에 내가 원하는 데이터값만 유지하기 위해서 각 칼럼마다 설정한다.
- 제약조건이 부여된 칼럼에 들어올 데이터에 문제가 있는지 자동으로 검사할 목적
    
    => 종류 : ★ NOT NULL, UNIQUE, CHECK, PRIMARY KEY, FOREIGN KEY  ★
    
    => 컬럼에 제약조건을 부여하는 방식 : 컬럼레벨방식 / 테이블 레벨방식
    

 

 

 


2.  NOT NULL 제약조건

- 해당 컬럼에 반드시 값이 존재해야만 할 경우 사용
    => NULL 값이 절대 들어와서는 안되는 칼럼에 부여하는 제약조건
         삽입/ 수정시 NULL값을 허용하지 않도록 제한하는 제약조건
        
※ 주의점 : 컬럼레벨 방식으로만 설정 가능

 

 

▶ NOT NULL 제약조건이 추가된 테이블 만들기
- 컬럼레벨방식으로 부여 : 컬럼명 자료형 제약조건 => 제약조건을 부여하고자하는 칼럼 바로 뒤에 기술

 

INSERT INTO MEMBER_NOTNULL VALUES(1, 'user01', 'pass01','홍길동','남','0101222-2222', '고래@naver.com');

 

☞ 정상적으로 값 추가됨

 

 

INSERT INTO MEMBER_NOTNULL VALUES (2, NULL, NULL, NULL, NULL, NULL, NULL);

 

☞ 에러발생. NOT NULL 제약조건에 위배되어 오류가 발생

 

 

 

 


3. UNIQUE 제약조건

- 컬럼에 중복값을 제한하는 제약조건
- 삽입/수정 시 기존에 해당 컬럼값 중에 중복값이 있을 경우 추가 또는 수정이 되지 않게 제약
        
=> 칼럼레벨방식/테이블레벨방식 둘 다 가능

 

 

▶ UNIQUE 제약조건이 추가된 테이블 만들기

 

☞ 컬럼레벨방식, 테이블 레벨방식 모두 가능하다.

☞  테이블레벨방식 : 모든 컬럼을 다 기술하고 마지막에 제약조건을 부여하는 방식

 

 

☞ 처음 1행은 삽입이 정상적으로 되지만, 다음 2행은 에러가 발생한 것을 확인할 수 있다. 그 이유는 MEMBER_ID에 UNIQUE 제약조건을 추가하였기 때문에 중복된 값을 넣을 수 없다.

 

☞ 제약조건을 부여할 때 직접 제약조건명을 지정해주지 않으면 시스템에서 알아서 중복되지 않는 임의의 제약조건명을 부여한다.

EX) SYS_C007055

 

 

 

▶ 제약조건 부여 시 제약조건명도 지정하는 표현법

    - 컬럼레벨방식
    컬럼명 자료형 [CONSTRAINT 제약조건명] 제약조건
    
    - 테이블레벨방식
    [CONSTRAINT 제약조건명] 제약조건 (컬럼명)
    
    => [CONSTRAINT 제약조건명]은 생략가능

 

 

 

☞ 제약조건명을 지정한 후에는 어떤 칼럼에 어떤 종류의 제약조건을 위배했는지 한눈에 파악할 수 있다.

 

 

 

 


4. CHECK 제약조건

: 컬럼에 기록될 수 있는 값에 대한 조건을 직접 설정 가능
   

EX) 성별칼럼에 남 또는 여, M 혹은 F, Y혹은 N 등의 값만 추가하고 싶을 때 사용

 

    [표현법]
    [컬럼명] CHECK [제약조건]

 

 

 

▶ CHECK 제약조건이 추가된 테이블 만들기

 

 

☞ '남' 이 아닌 '님'의 값을 추가하면 에러 발생

☞ 그렇다면 CHECK 제약조건으로 NULL 값도 INSERT 가능한가? 가능하다!!

☞ 추가적으로 NULL값을 못들어오게 하고싶다면 NOT NULL 제약조건도 같이 걸어주면 됨

 

 

 

 


5. PRIMARY KEY(기본키) 제약조건

: 테이블에서 각 행들의 정보를 유일하게 식별할 수 있는 컬럼에 부여하는 제약조건
 => 각 행들을 구분할 수 있는 식별자의 역할


 EX) 사번, 부서아이디, 직급코드, 회원번호, 학번 등...
 => 식별자의 조건 : 중복X, 값이 없으면 안됨(NOT NULL + UNIQUE)
    
☞ 한 테이블당 한개의 기본키만 지정 가능

 

 

▶ PRIMARY KEY 제약조건이 추가된 테이블 만들기(컬럼 레벨 방식)

 

 

PRIMARY KEY 제약조건이 추가된 테이블 만들기(테이블 레벨 방식)

 

 

☞ 기본키 컬럼에는 중복값, NULL 값을 부여할 수 없다. 항상 고유한 값이 들어가야함.

 

 

복합키로 사용할 경우

 

 

 

 

☞ 모두 정상적으로 삽입이 되었다. 이는 ID는 중복되지만 이름은 중복되지 않기 때문에 값이 삽입된 것이다.

ID와 NAME을 복합키 설정하였기 때문에 ID와 NAME 값이 모두 동일해야지만 중복값으로 인식한다.

 

 

☞ 테이블당 한개의 PRIMARY KEY만 사용할 수 있는데, 두개의 컬럼을 기본키로 사용하고 싶은경우 두 컬럼을 묶어서 한번에 PRIMARY KEY로 설정가능하다.
☞  PRIMARY KEY(MEMBER_ID, MEMBER_NAME)  => 두 컬럼값을 묶어서 중복처리

 

=> 복합키일 경우 두 컬럼의 값이 완전히 중복되어야지만 제약조건에 위배된다.
=> 복합키일 경우 한 컬럼의 값이 NULL이더라도 제약조건에 위배된다.

 

 

 

 


6. FOREIGN KEY(외래키)

: 해당 컬럼에 다른 테이블에 존재하는 값만 들어와야하는 컬럼에 부여하는 제약 조건
    => "다른 테이블을 참조한다"라고 표현
    => 즉, 참조된 다른 테이블이 제공하고 있는 값만 들어올 수 있다.
        EX) KH계정에서
            EMPLOYEE테이블의 DEPT_CODE같은 경우 DEPARTMENT 테이블의 DEPT_ID에
            이미 들어가 있는 값들만 사용하고 있었다.
    => FOREIGN KEY 제약조건으로 테이블간의 연결고리를 만들어서 다른 테이블과 관계를 형성할 수 있다.
    
    [표현법]
    ▶ 컬럼레벨방식 제약조건 설정시

 컬럼형 자료형 [CONSTRAINT 제약조건명] REFERENCES 참조테이블명[(참조할컬럼명)]


    
    ▶ 테이블레벨 방식

[CONSTRAINT 제약조건명] FOREIGN KEY(컬럼명) REFERENCES 참조할테이블명[(참조할컬럼명)]


    => 생략가능한 키워드 CONSTRAINT 제약조건명, 참조할컬럼명
    => 참조할컬럼명 생략시 참조할테이블의 PRIMARY KEY에 해당하는 컬럼이 참조할컬럼으로 설정된다.
    


    ☞ 참조할 칼럼명 타입과 외래키로 지정할 칼럼의 타입(자료형)이 일치해야한다.

 

 

 

① 부모테이블(참조테이블) 만들기

회원등급에 대한 데이터를 보관하는 테이블(등급코드, 등급명)

 

 

 

=> 데이터 추가

 

 

 

 FOREIGN KEY 추가된 테이블 만들기

 

 

 

=> 정삭적으로 값 삽입된 것 확인

 

 

▶'G4' 값 삽입(MEM_GRADE 테이블에는 G1, G2, G3의 값만 들어있다)

 

 

☞ 하지만...'G4'를 넣게 되면 부모키를 찾을 수 없다! 는 오류가 발생하게 된다.

☞ 부모테이블의 GRADE_ID 칼럼테이블을 참조하는 값이 없다!

 

 

 

 외래키 제약조건에는 NULL 값도 들어갈 수 있다.
 NULL 값이 안들어가게 하려면 NOT NULL 제약조건도 추가해야한다.

 

 

 

1) MEM_GRADE(부모테이블)에서 불필요한 데이터가 있어서  데이터값을 삭제하고자 하는 경우

 

 

예) MEM_GRADE테이블로부터 GRADE_CODE가 'G1'인 데이터를 삭제하려고 한다.

 

 

☞ 자식테이블 중에 GRADE_ID 컬럼에서 G1값을 이미 참조해서 사용하고 있기 때문에 삭제할 수 없다.
현재 외래키 제약조건 부여 시 삭제처리에 대한 옵션을 따로 부여하지 않았음.
기본적으로 삭제 제한 옵션이 걸려있다.

 

 

자식 테이블 생성 시 부여(외래키 제약조건을 부여했을 때)
    부모테이블(참조테이블)의 데이터가 삭제되었을 때 자식테이블에는 어떻게 처리할 지를 옵션으로 정해둘 수 있다.
    


 FOREIGN KEY 삭제 옵션
    - ON DELETE  RESTRICTED : 삭제 제한 => 기본 옵션
    - ON DELETE  SET  NULL : 부모데이터를 삭제할 때 해당 데이터를 사용하는 자식데이터를 NULL로 바꾸겠다.
    - ON DELETE  CASCADE : 부모데이터를 삭제할 때 해당 데이터를 사용하는 자식데이터를 함께 삭제하겠다.

 

 

 

 

■ ON  DELETE  SET  NULL 제약조건 추가

 

 

 

 

=> 값을 추가한후, 'G1' 삭제

 

 

☞ G1을 참조하고 있던 칼럼값이 NULL로 바뀐다.

 

 

 

 

■ ON  DELETE  CASCADE 제약조건 추가

 

 

 

 

=> GRADE_ID가 'G3'이었던 한 행이 전체 삭제된 것 확인

 

 

☞ 외래키 제약조건이 없더라도 조인이 가능함.
 단, 두 컬럼에 동일한 의미의 데이터가 담겨 있어야함
    (자료형이 같고, 담긴값의 종류나 의미도 비슷해야함)