INSERT(삽입)
: 테이블에 새 행 추가
UPDATE(갱신)
: 테이블의 기존 행 수정
DELETE(삭제)
: 테이블에서 기존 행 제거
트랜잭션 --> 논리적 작업 단위를 형성하는 DML문 모음
INSERT INTO table | (column |, column...|) |
VALUES (value [, value...]) ;
문자와 날짜 값
은 작은 따옴표로 묶음INSERT INTO copy_dept(department_id, department_name, manager_id, location_id)
VALUES (70, 'Public Relations', 100, 1700);
: 열 리스트에서 열 생략
INSERT INTO copy_dept (department_id, department_name)
VALUES (80, 'Purchasing');
: VALUES절에서 NULL 키워드 지정
INSERT INTO copy_dept
VALUES (90, 'Finance', NULL, NULL);
📌 COMMIT(커밋)
COMMIT;
- 변경된 사항을 저장할 때 사용
- DB에 영구적으로 저장됨
INSERT INTO copy_emp
VALUES (113,'Louis', 'Popp', 'LPOPP', '515.124.4567',
CURRENT_DATE, 'AC_ACCOUNT', 6900, NULL, 205, 90);
-- TO_DATE 사용
INSERT INTO copy_emp
VALUES (114, 'Den', 'Raphealy', 'DRAPHEAL', '515.127.4561',
TO_DATE('2003/02/03', 'YYYY/MM/DD'),
'SA_REP', 11000, 0.2, 100, 80);
& 치환 변수
INSERT INTO copy_dept
(department_id, department_name, location_id)
VALUES (&department_id, '&department_name',&location);
INSERT INTO copy_emp(employee_id, last_name, email, hire_date, job_id, salary, commission_pct)
SELECT employee_id, last_name, email, hire_date, job_id, salary, commission_pct
FROM employees
WHERE job_id LIKE '%REP%';
UPDATE table
SET column = value [, column = value, ...][WHERE condition] ;
UPDATE copy_emp
SET department_id = 50
WHERE employee_id = 113;
UPDATE copy_emp
SET department_id = 110;
=
NULL을 지정하여 열 값을 NULL로 갱신📌 ROLLBACK(롤백)
ROLLBACK;
이전 상태로 되돌리고자 할 때 사용
UPDATE copy_emp
SET (job_id,salary) = (SELECT job_id,salary
FROM copy_emp
WHERE employee_id = 104)
WHERE employee_id = 103;
UPDATE copy_emp
SET department_id = (SELECT department_id
FROM copy_emp
WHERE employee_id = 103)
WHERE job_id = (SELECT job_id
FROM copy_emp
WHERE employee_id = 125);
WHERE절 없으면, 테이블의 모든 행 제거 가능
DELETE [FROM] table
[WHERE condition] ;
DELETE FROM copy_dept
WHERE department_name = 'Finance';
DELETE FROM copy_emp;
DELETE FROM copy_emp
WHERE department_id = (SELECT department_id
FROM copy_dept
WHERE department_name = 'Shipping');
TRUNCATE는 DDL(Data Definition Language, 데이터 정의어)
TRUNCATE TABLE table_name ;
TRUNCATE TABLE copy_emp;
일관성
보장검토
그룹화
ROLLBACK TO SAVEPOINT
문을 사용하여, 해당 표시자로 롤백UPDATE...
SAVEPOINT update done;
INSERT...
ROLLBACK TO update done;
DELETE copy_dept
WHERE department_id = 100 ;
SAVEPOINT A ;
DELETE copy_dept
WHERE department_id = 90 ;
SAVEPOINT B ;
DELETE copy_dept
WHERE department_id = 80 ;
SELECT * FROM copy_dept ;
-- department_id = 80이 복구됨
ROLLBACK TO SAVEPOINT B ;
SELECT * FROM copy_dept ;
-- department_id = 90이 복구됨
ROLLBACK TO A ;
SELECT * FROM copy_dept ;
-- 수정사항 저장
COMMIT ;
- 이전의 데이터 상태 복구 가능
- 현재 세션은 SELECT문을 사용하여 DML 작업 결과 확인 가능
- 다른 세션은 현재 세션이 실행한 DML문의 결과를 볼 수 X
- 영향을 받는 행이 잠기므로(LOCK), 다른 세션이 영향을 받는 행의 데이터를 변경할 수 X
- 데이터 변경사항이 데이터베이스에 저장됨
- 이전의 데이터 상태를 겹쳐 씀
- UNDO(언두) 데이터가 필요없어져서 비워짐
- 모든 세션이 결과 확인 가능
- 영향을 받는 행의 잠금이 해제되어, 이러한 행을 다른 세션에서 조작 가능
- 모든 저장점이 지워짐
보류 중인 모든 변경 사항을 폐기
- 데이터 변경사항이 실행 취소됨
- 이전의 데이터 상태가 복원됨
- 영향받는 행의 잠금이 해제됨
⚠️ commit을 진행한 후 rollback을 실행시키면
commit 이후로 rollback 됨!
(권장되는 건 아닌데 참고용)
SELECT(검색)는 기본적으로 Lock(락)을 걸지 않음
FOR UPDATE
절을 사용하면, 검색된 행을 기반으로 Lock(락)이 요청됨
ROLLBACK 또는 COMMIT
을 실행하는 경우에만 Lock이 해제됨A> SELECT *
FROM copy_dept
WHERE manager_id IS NULL
FOR UPDATE ;
B> ROLLBACK ;
B> UPDATE copy_dept
SET location_id = 4000
WHERE department_id = 90 ;
A> ROLLBACK ;
SELECT e.employee_id, e.salary, e.commission_pct
FROM employees e JOIN departments d
USING (department_id)
WHERE job_id = 'ST_CLERK'
AND location_id = 1500
FOR UPDATE OF e.salary
ORDER BY e.employee_id;