* 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

+ Recent posts