오라클 CONSTRAINT 이름 변경 - olakeul CONSTRAINT ileum byeongyeong

데이터 딕셔너리로부터 테이블 정의가 삭제되며 테이블 로우(ROW) 및 연관되어 생성된 인덱스, 트리거는 함께 삭제되지만 연관된 스키마 오브젝트 중 뷰 및 함수 및 프로시저는 삭제되지 않고 ‘INVALID’ 상태가 됩니다. 
  • 삭제되는 테이블의 기본 키primary key 또는 고유 키unique key를 자식 테이블에서 참조하고 있다면 삭제에 실패하게 됩니다. 그럴 때는 자식 테이블을 먼저 삭제하거나 DROP TABLE 명령어 마지막에 CASCADE CONSTRAINTS 조건을 주면 됩니다. CASCADE CONSTRAINTS 옵션은 삭제하는 테이블의 기본 키나 고유 키를 참조하는 참조 무결성 제약조건을 동시에 삭제하는 경우에 사용됩니다.
  • 삭제되는 테이블에 할당된 확장 영역은 테이블스페이스에 반환되며 다른 오브젝트 생성 시 사용할 수 있게 되고 삭제된 테이블은 플래시백 옵션으로 복구할 수 있습니다. 
  •  

    이전에 실습한 CREATE TABLE ~ AS 구문으로 존재하는 테이블을 기본으로 새로운 테이블을 생성 후 이름을 변경하고, 테이블을 삭제하는 실습 그리고 부모, 자식 관계를 가지는 테이블에서 부모 또는 자식 테이블을 삭제하는 실습을 해보겠습니다.

    실습

     

    CREATE TABLE ~ AS 구문으로 존재하는 테이블을 기본으로 새로운 테이블을 생성하고 이름을 변경 후 삭제해 보겠습니다.

     

    EMP 테이블에서 전체 테이블 구조만 복사하여 EMP10 테이블을 생성 후 이름을 EMP109로 변경하세요.(EMP10 테이블이 이미 존재한다면 삭제 후 실습하세요)

     

    CREATE TABLE EMP10 AS SELECT * FROM EMP WHERE 1 = 2;

    RENAME EMP10 TO EMP109;

     

    <실행결과>

    테이블 이름이 변경되었습니다.

     

    EMP109 테이블을 삭제하세요.

     

    DROP TABLE EMP109;

     

    <실행결과>

    Table EMP109이(가) 삭제되었습니다.

     

    실습

     

    업무상 필요에 따라 사용자 계정의 전체 테이블을 삭제하는 스크립트를 생성하는 경우도 가끔 있습니다. 아래 실습에서 삭제 스크립트 생성하는 방법에 대해 살펴 보겠습니다.

     

    현재 접속한 사용자의 테이블을 모두 삭제하는 DROP TABLE 스크립트를 생성하세요.

     

    SELECT 'DROP TABLE  ' || TABLE_NAME || ';' AS "DROP SCRIPT"  

    FROM USER_TABLES;

     

    <실행결과>

     DROP SCRIPT1DROP TABLE  BONUS;2DROP TABLE CUSTOMER;3...



    실습

    이번에는 부모, 자식 관계를 가지는 테이블을 생성하여 DROP TABLE을 실습합니다.

     

    deptno, dname 컬럼을 가지는 DEPT_TEST라는 테이블을 생성합니다. deptno 컬럼이 기본 키입니다. DEPT_TEST 테이블이 이미 존재한다면 삭제 후 실습하세요.

     

    CREATE TABLE DEPT_TEST (

       DEPTNO NUMBER(2) CONSTRAINT PK_DEPT_TEST PRIMARY KEY,

       DNAME VARCHAR2(14)

    ) ;

     

    empno, ename, deptno 컬럼을 가지는 EMP_TEST 테이블을 생성하세요. empno는 Primary Key 이고 deptno 컬럼은 외래 키foreign key로 DEPT_TEST 테이블의 deptno 컬럼을 참조합니다.

     

    CREATE TABLE EMP_TEST (

       EMPNO NUMBER(4) CONSTRAINT PK_EMP_TEST PRIMARY KEY,

       ENAME VARCHAR2(100),

       DEPTNO NUMBER(2) CONSTRAINT FK_DEPTNO_TEST REFERENCES DEPT_TEST

    );

     

    EMP_TEST 테이블의 deptno 컬럼에 KEY를 내려주는 DEPT_TEST를 부모이고 받는 EMP_TEST가 자식입니다.

     

    외래 키를 지정하는 이유는 EMP_TEST 테이블의 deptno 컬럼은 값이 없는 것은 받아주지만(NULL 허용 컬럼), 값이 들어온다면 DEPT_TEST 테이블의 DEPTNO값만 허용하려는 의도에서 입니다. 이것이 ‘참조하는 데이터는 무결해야 한다’는 데이터 무결성의 한 종류인 참조 무결성입니다. 

     

    참고로 개체 무결성이라는 것은 개체, 테이블이 무결해야 한다는 의미입니다. 예를 들어 Primary Key 컬럼은 중복이 없어합니다, 사번이 같은 직원이 있으면 안되니 까요. 오라클에서 Primary Key를 지정하면 해당 컬럼에 대해 별도의 영역에 인덱스를 생성하고 PK  컬럼에 NOT NULL, UNIQUE 제약조건을 걸어줍니다. 이렇게 하면 새 행을 추가할 때 PK 컬럼에 값이 꼭 들어와야 하며 중복되어서도 안 됩니다(개체 무결성).

     

    부모 테이블인 DEPT_TEST 삭제를 시도해봅시다.

     

    DROP TABLE DEPT_TEST;

     

    <실행결과>

    ORA-02449: 외래 키에 의해 참조되는 고유/기본 키가 테이블에 있습니다.

     

    외래 키로 지정된 자식 테이블이 있기 때문에 부모를 먼저 지울 수는 없어 에러가 발생했습니다. 자식 DEMP_TEST 테이블을 먼저 삭제 후 DEPT_TEST 테이블을 삭제하는 것이 정상적인 방법입니다. 아래에서 제약조건을 비활성해서 삭제해봅니다. 

     

    CASCASE CONSTRAINTS 옵션을 이용해 부득이 자식이 있는 DEPT_TEST를 삭제합시다.

     

    DROP TABLE DEPT_TEST CASCADE CONSTRAINTS;

     

    <실행결과>

    Table DEPT_TEST이(가) 삭제되었습니다.

     

    외래 키 제약조건을 삭제 후 테이블을 삭제했습니다. DEPT_TEST 테이블을 삭제 후 EMP_TEST 테이블의 테이블 생성 스크립트를 확인하면 다음과 같습니다(deptno 컬럼에 기술한 외래 키 제약조건이 사라졌습니다).

    Column Name & Constraints 이름 변경 예

    :namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /> 

    테이블이나 인덱스의 이름을 변경하는 것은 오라클 9iR2 이전에도 가능했지만 9iR2에서는 테이블의 컬럼 명 또는 제약조건의 이름을 변경하는 것이 가능해 졌습니다.

     

     

    SQL> create table test (

      2  c1 varchar2(4) not null,

      3  c2 number(10)  not null

      4  );

     

    테이블이 생성되었습니다.

     

    프라이머리 키를 추가 합니다이때 C1컬럼에 대해 인덱스가 생성 됩니다.

     

    SQL> alter table test add (constraint pk_test

      2                        primary key (c1));

     

    테이블이 변경되었습니다.

     

    SQL> desc test;

     이름                                      ?      유형

     ----------------------------------------- -------- --------------

     

     C1                                        NOT NULL VARCHAR2(4)

     C2                                        NOT NULL NUMBER(10)

     

    사용자의 제약 조건을 확인 할  수 있는 USER_CONSTRAINTS VIEW를 통해 TEST 테이블에 제약조건의 타입이 P 인것 즉 Primary Key인 제약조건을 검색 합니다제약조건에는 NOT NULL, UNIQUE, CHECK, PRIMARY KEY등 테이블의 컬럼에 제약을 가하는 조건을 말합니다.

     

    SQL> select constraint_name

      2  from   user_constraints

      3  where  table_name = 'TEST'

      4  and    constraint_type = 'P';

     

    CONSTRAINT_NAME

    ------------------------------

    PK_TEST

     

    이번에는 TEST 테이블에 생성되어 있는 인덱스를 확인 합니다위에서 C1 컬럼을 Primary Key로 설정하여 저절로 이 컬럼에 대한 인덱스가 생성되어 있습니다.

     

    SQL> select index_name,

      2         column_name

      3  from   user_ind_columns

      4  where  table_name = 'TEST';

     

    INDEX_NAME           COLUMN_NAME

    ------------------------------------

     

    PK_TEST                     C1

     

    우선 테이블의 이름을 바꾸어 봅니다이 기능은 오라클의 이전 버전에서도 되는 기능 입니다

     

    SQL> alter table test rename to test1;

     

    테이블이 변경되었습니다.

     

    이번에는 컬럼명을 바꾸어 보죠^^

     

    SQL> alter table test1 rename column c1 to code;

     

    테이블이 변경되었습니다.

     

    Primary Ket 제약 조건의 이름을 변경 합니다.

     

    SQL> alter table test1 rename constraint pk_test to pk_test1;

     

    테이블이 변경되었습니다.

     

    이번에는 Primary Key에 걸린 인덱스의 이름을 바꿉니다.

     

    SQL> alter index pk_test rename to pk_test1;

     

    인덱스가 변경되었습니다.

     

    위에서 변경한 내역에 대해 확인해 보겠습니다

     

    SQL> select constraint_name

      2  from   user_constraints

      3  where  table_name = 'TEST1'

      4  and    constraint_type = 'P';

     

    CONSTRAINT_NAME

    ------------------------------

    PK_TEST1

     

    SQL> select index_name,

      2         column_name

      3  from   user_ind_columns

      4  where  table_name = 'TEST1';

     

    INDEX_NAME             COLUMN_NAME

    ---------------------------------------------

     

    PK_TEST1                    CODE


    출처 : http://www.onjprogramming.co.kr/oraclejavanew/oraclejava/

    공유하기

    게시글 관리

    구독하기Moment Of Truth

    저작자표시 비영리 변경금지

    '스크랩 자료' 카테고리의 다른 글

    DDL,DML,DCL 이란 무엇인가?  (0)2013.08.06CASE를 활용한 SQL 통합  (0)2013.07.31default 키워드 사용 예제  (0)2013.07.31Explicitly Named Indexes(9i)  (0)2013.07.31first_value, last_value를 이용하기  (0)2013.07.31