* Constraint
SELECT table_name, constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name IN('EMP', 'DEPT');
ALTER TABLE dept
DROP primary key; <- 삭제가 되지 않는다.
ALTER TABLE dept
DROP primary key CASCADE; <- 옵션을 추가해 준다.
SELECT table_name, constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name IN('EMP', 'DEPT'); <- 다시 확인해 본다.
ALTER TABLE dept
ADD primary key(department_id);
ALTER TABLE emp
ADD CONSTRAINT emp_deptid_fk foreign key(department_id)
REFERENCES departments(department_id); <- 제약 조건을 다시 만들고,
SELECT table_name, constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name IN('EMP', 'DEPT'); <- 다시 확인해 보면, enabled 상태.
INSERT INTO dept
VALUES(10, 'CS', null, null);
UPDATE emp
SET department_id = 300
WHERE employee_id = 176; <- 두 문장 모두 오류 발생
ALTER TABLE dept
DISABLE primary key;
ALTER TABLE emp
DISABLE CONSTRAINT emp_deptid_fk; <- 제약 조건을 끌 수 있다.
SELECT table_name, constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name IN('EMP', 'DEPT'); <- 확인해 보면, 두 제약 조건은 disable 상태.
제약 조건을 disable하고, 테이블에 새로운 데이터를 입력 후 enable할 때 문제가 있으면 enable되지 않는다.
문제가 있는 해당 데이터(중복 등)를 삭제 후 enable 해주어야 한다.
DELETE FROM dept
WHERE department_name = 'CS';
UPDATE emp
SET department_id = 30
WHERE employee_id = 176; <- 데이터 갱신 후
ALTER TABLE dept
ENABLE primary key;
ALTER TABLE emp
ENABLE CONSTRAINT emp_deptid_fk; <- 제약 조건 enable
* Cascading Constraints
연쇄 제약 조건
@c:\oraclexe\labs\cre_test1.sql <- TEST1 테이블 생성
DESC test1;
SELECT table_name, constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name = 'TEST1';
ALTER TABLE test1
DROP COLUMN col2; <- 삭제가 된다.
ALTER TABLE test1
DROP COLUMN col1; <- 삭제가 안 된다.
ALTER TABLE test1
DROP COLUMN col1
CASCADE CONSTRAINTS; <- 옵션 추가하여 삭제.
DROP TABLE test1; <- 테스트 끝났으니 테이블 삭제.
* DROP TABLE ... PURGE : 영구 삭제
DROP TABLE emp;
SELECT * FROM tab;
SHOW RECYCLEBIN; <- 휴지통 보기
FLASHBACK TABLE emp TO BEFORE DROP; <- 복원
DESC emp;
DROP TABLE emp PURGE; <- 완전 삭제, FLASHBACK 불가.
PURGE RECYCLEBIN; <- 휴지통 비우기
※ 오라클의 휴지통 특징
- 파일 이동이 없다. 따라서, 속도가 빠르다.
* Temporary Tables : 임시 테이블
- 장바구니 개념
CREATE GLOBAL TEMPORARY TABLE emp_temp1
ON COMMIT DELETE ROWS
AS
SELECT employee_id, salary, department_id
FROM employees;
CREATE GLOBAL TEMPORARY TABLE emp_temp2
ON COMMIT PRESERVE ROWS
AS
SELECT employee_id, salary, department_id
FROM employees;
< 재접속 >
SELECT * FROM emp_temp1;
SELECT * FROM emp_temp2; <- 테이블에 아무것도 없다.
INSERT INTO emp_temp1
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id = 50;
INSERT INTO emp_temp2
SELECT employee_id, salary, department_id
FROM employees
WHERE department_id = 60; <- 데이터 삽입
SELECT * FROM emp_temp1;
SELECT * FROM emp_temp2;
COMMIT;
SELECT * FROM emp_temp1; <- 테이블이 비워진다.
SELECT * FROM emp_temp2; <- 테이블의 내용이 유지된다.
※ 임시 테이블은 세션 범위를 벗어나지 못한다.
* External Tables : 외부 테이블
- 자주 사용하지는 않지만, 버리지는 못하는 자료를 빼두는 용도로 사용
ex) 은행 거래내역 등
- Oracle 9i부터 사용
- DML 불가
- 부득이하게 수정이 필요하면, 파일을 직접 수정
실습)
- SQL*Plus에서 권한 주기
> conn / as sysdba
Connected.
SYS> CREATE DIRECTORY dir_1
AS 'c:\oraclexe\test';
Directory created.
SYS> GRANT read, write ON DIRECTORY dir_1 TO hr;
Grant succeeded.
- SQL문 실행
@C:\oraclexe\labs\cre_empxt.sql;
DESC empxt;
SELECT * FROM empxt;
Manipulating Large Data Sets
생략
★ Oracle의 Flashback 기술에 대하여
- 빠르게 취소하는 기능(commit이 된 것)
- 과거에는 못 했는데 가능하도록 추가된 기능.
- Flashback Query - 9i ver.~ ┐
- Flashback Versions Query │→ Undo data 읽기 방식(영구적이지 않음)
- Flashback Transaction Query - Undo SQL ┘
- Flashback Table ($)
- Flashback Data Archive ($) - 11g ver.~
- Flashback Undrop - Recyclebin
- Flashback Database ($)
※ ($) 표시는 유료 옵션
'스마트웹&콘텐츠 개발자 과정 > Oracle' 카테고리의 다른 글
6/5 오후 (0) | 2018.06.05 |
---|---|
SQL (6/4 오후) (0) | 2018.06.04 |
5/30 오후 (0) | 2018.05.30 |
5/29 오후 (0) | 2018.05.29 |
SQL 수업 (5/28 오후) (0) | 2018.05.28 |