220127 DML, TCL, 무결성 제약조건
9. DML(Data ManipulationLanguege: 데이터 조작어)
* update set : 데이터 수정
- 형식
update 테이블명 set 컬럼1=수정할값1,
컬럼2=수정할값2,...
where 조건절;
- 모든 데이터 수정 -> where 조건절 사용하지 않는 경우
update emp01 set sal=sal*1.1; --전체 변경
- 특정 데이터 수정 -> where 조건절 사용
update emp02 set hiredate=sysdate where substr(hiredate,1,2)='87'; --87년 입사자 날짜 변경
update emp02 set hiredate=sysdate, sal=50, comm=4000 where ename='SCOTT'; --scott 정보 변경
- 서브쿼리 이용한 데이터 수정
update dept01 set loc=(select loc from dept01 where deptno=40) where deptno=20;
-- 부서번호 40인 row의 loc값으로, 부서번호 20인 row의 loc값을 수정
* delete from: 데이터 삭제
- 형식
delete from 테이블명 where 조건절;
- 모든 데이터 삭제 -> where 조건절 사용하지 않음
delete from dept01;
- 특정 데이터 삭제 -> where 조건절 사용
delete from dept01 where deptno=30;
- 서브쿼리 이용한 데이터 삭제
delete from emp02 where deptno=(select deptno from dept01 where dname='SALES');
* merge: 테이블 합병
: 동일한 구조의 두 테이블만 합병 가능
: 기존에 존재하는 값이 있는 row는 새로운 값으로 update, 존재하는 값이 없는 row는 insert됨
merge into emp01 using emp02 on(emp01.empno = emp02.empno) // 공통조건 when matched then // 기존에 존재하는 값이 있다면 update set emp01.ename = emp02.ename, // emp02의 값을 01에 덮어써라(update) emp01.job = emp02.job, emp01.mgr = emp02.mgr, emp01.hiredate = emp02.hiredate, emp01.sal = emp02.sal, emp01.comm = emp02.comm, emp01.deptno = emp02.deptno when not matched then // 기존에 존재하는 값이 없다면 insert values(emp02.empno, emp02.ename, emp02.job, // emp2 값을 01에 insert emp02.mgr,emp02.hiredate, emp02.sal, emp02.comm,emp02.deptno); |
10. TCL (Transaction Control Language)
트랜잭션
: 오라클에서 발생하는 여러 sql 명령문을 하나의 논리적인 작업 단위로 처리하는 것
: 데이터의 일관성을 유지하면서, 데이터를 안정적으로 복구하기 위해 사용
: 하나의 트랜잭션은 All-OR-Nohing방식
-> 명령어의 집합 전체가 정상적으로 처리될 시 정상 종료(all), 하나라도 잘못될 경우 전체 취소(nothing)
-> 데이터의 무결성 보장
* commit ---> ALL
: 모든 작업들을 정상적으로 처리한다고 확정하는 명령어 (실제 DB에 저장)
- 처리과정을 DB에 모두 반영하기 위해 변경 내용을 영구 저장 (작업 데이터 완전 update)
- commit 명령어를 수행하면 하나의 트랜잭션 과정이 종료됨
delete from dept01 where deptno=20;
commit;
---> 트랜젝션 완료(all) 후 종료되었으므로 rollback(nothing)으로 되돌릴수 없음
- 자동 commit
01. sql이 정상적으로 종료: quit, exit, con.close()
02. DDL, DCL 명령문 수행: DDL(create, alter, drop,...) DCL(grant, revoke)
※ DDL(truncate)와 DML(delete)의 차이 ---> 롤백 가능 여부
---> truncate는 DDL 명령어이므로 이를 이용할 경우 자동 commit-> 영구삭제, 복구(롤백) 불가
---> delete는 DML 명령어 -> 직접 commit해서 트랜잭션 완료되기 전까지 롤백 가능
* rollback ---> Nothing
: 트랜잭션의 처리과정에서 발생한 변경사항을 취소하는 명령어
- 처리 중이던 모든 과정을 취소하고 하나의 묶음 처리가 시작되기 이전의 상태로 되돌림 (이전 commit한 곳)
- rollback 명령어를 수행하면 하나의 트랜잭션 과정이 종료됨 (commit이랑 차이 기억)
delete from dept01;
rollback;
- 자동 rollback
01. sql이 비정상적으로 종료되면 자동 rollback
02. 정전이나 컴퓨터 전원이 끊기는 등의 문제 발생 시 자동 rollback
* savepoint
: 트랜잭션 처리과정 내에 복구할 시점(저장점)을 지정하는 명령어 -> 트랜잭션을 분할
- 여러 개의 sql문을 실행하는 트랜잭션의 경우 유저가 중간에 세이브포인트 지정 가능
- rollback to savepoint 문을 이용해 지정한 세이브포인트까지 롤백할 수 있음
- A-B-C-현재시점이라고 할 때 A까지 롤백하려면 세이브포인트 C 롤백, B 롤백, 전체롤백 순으로 실행해야함
11. 무결성 제약 조건(Integrity Constraint Rule)
: 테이블에 부적절한 자료가 입력되는 것을 방지하기 위해 테이블 생성할 때 컬럼에 대해 정의하는 여러가지 규칙
* 제약조건명
제약 조건에 대한 label을 붙이는 것
* NOT NULL
: null 값을 허용하지 않는다 ---> 반드시 값을 입력해야 한다
* UNIQUE
: 유일한 값만 입력할 수 있다 ---> 중복을 허용하지 않는다
: null 값 허용
* PRIMARY KEY (기본키)
: null 값을 허용하지 않음 (not null의 특징)
: 중복을 허용하지 않음 (unique의 특징) ---> not null+unique
* FOREIGN KEY
* CHECK
* DEFAULT