고래씌
[Oracle] 6-2. DDL(CREATE) - DDL 계정 ② (INSERT, 제약 조건) 본문
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'이었던 한 행이 전체 삭제된 것 확인
☞ 외래키 제약조건이 없더라도 조인이 가능함.
☞ 단, 두 컬럼에 동일한 의미의 데이터가 담겨 있어야함
(자료형이 같고, 담긴값의 종류나 의미도 비슷해야함)
'Database > Oracle' 카테고리의 다른 글
[Oracle] 6-3. DDL(CREATE) - DDL 계정 ③ (DEFAULT) (0) | 2023.11.29 |
---|---|
[Oracle] DB 실습문제 3(Option) (0) | 2023.11.29 |
[Oracle] 6-1. DDL(CREATE) - DDL 계정 ① (CREATE) (0) | 2023.11.28 |
[Oracle] 5-2. DML(SELECT) - INLINE VIEW(인라인 뷰), WINDOW FUNCTION(순위 매기는 함수) (1) | 2023.11.28 |
[Oracle] DB 실습문제 2(Function) (0) | 2023.11.27 |