2014년 9월 18일 목요일

EXCEPTION TABLE을 이용하여 중복된 자료를 확인하는 방법[오라클개발자교육/오라클/ORACLE강좌/오라클교육잘하는곳/오라클교육추천/ORACLE실무교육/ORACLE/ORACLE교육/ORACLE학원/오라클실무교육]

EXCEPTION TABLE을 이용하여 중복된 자료를 확인하는 방법  
  
  
table에 data가 들어 있는 상태에서 unique index를 생성하려는 경우 중복된 
자료가 있다는 error를 만나는 경우가 있다. 

ORA-01452: cannot CREATE UNIQUE INDEX; duplicate keys found 

이 경우에 어느 data가 중복되어 있는지 확인하고 정리하고자 한다면 
alter table ... enable...명령을 사용하여 가능하다. 


1) 우선 create index 명령을 사용하지 않고, 
  alter table 명령을 이용하여 unique index에 해당하는 constraint를 생성한다. 

  여기에서 UNIQUE대신에 PRIMARY KEY가 필요한 경우에는 사용할 수 있다. 
  

    SQL> ALTER TABLE dept 
        ADD CONSTRAINT un_deptno UNIQUE(deptno) disable; 

  이때 disable을 지정하지 않으면, 다음과 같은 error를 만나며 constraint가 
  생성되지 않는다. 

ORA-02299: cannot enable (KHLEE.UN_DEPTNO) - duplicate keys found. 


2)  SQL> ALTER TABLE dept 
  ENABLE CONSTRAINT un_deptno 
 EXCEPTIONS INTO exceptions; 

만약 예외 사항이 없다면 enable이 되고, 예외 사항이 있다면 다음의 error와 함께 
disable인 상태로 남게 된다. 

 ORA-02299: cannot enable (KHLEE.UN_DEPTNO) - duplicate keys found. 

예외 사항에 대한 정보는 exceptions라는 table에 들어가게 된다. 

* enable을 하기 전에 enable의 exceptions options으로부터 정보를 수용하려면 
 적합한 예외 사항 보고 table인 exceptions라는 table을 생성하여야 한다. 

 이것은 $ORACLE_HOME/rdbms/admin/utlexcpt.sql을 해당 user에서 실행해주면 
 생성된다. 
 이 script 내에서 table의 이름을 변경하여 사용하여도 가능하다. 


3) 예외사항의 확인. 
아래와 같이 중복된 record에 대한 정보를 exceptions table에서 확인가능하다. 

SQL> SELECT * FROM exceptions; 

ROW_ID            OWNER    TABLE_NAME CONSTRAINT 
------------------ -------- ---------- ---------- 
000024BB.0005.0005 KHLEE    DEPT      UN_DEPTNO 
000024BB.0002.0005 KHLEE    DEPT      UN_DEPTNO 


4) 자세한 sql을 이용하여 제약 조건에 위배되는 row들을 확인할 수 있다. 

SQL> SELECT deptno, dname, row_id 
    FROM dept, exceptions 
    WHERE exceptions.constraint = 'UN_DEPTNO' 
    AND dept.rowid = exceptions.row_id; 

  DEPTNO DNAME          ROW_ID 
--------- -------------- ------------- 
      30 XX            000024BB.0005.0005 
      30 SALES          000024BB.0002.0005 


5) 해당 data를 확인한 후 제약조건에 위배되는 자료를 삭제한다. 
  다음과 같이 해당 table의 다른 컬럼을 이용하여 지울수도 있고 혹은 
  rowid값을 이용할 수 있다. 

SQL> DELETE FROM dept 
    WHERE deptno = 30 
    AND dname = 'XX'; 

또는 

SQL> delete from dept where rowid='000024BB.0005.0005'; 

6) 해당 constraint를 enable한다. 

SQL> alter table dept enable constraint un_deptno; 

Table altered. 

  
 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-271894
 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취…오라클자바…12-111382
53 [평일주간]100%환급6건,안드로이드,자바,C#,스프링3.2,SQL,힌트/… 오라클자바…03-151126
52 [주말주간]C#, ASP.NET마스터 오라클자바…01-311294
51 [평일,기업100%환급]SQL기초에서 Schema Object까지 오라클자바…01-311084
50 [평일야간]HTML5, CSS3,Ajax, jQuery마스터과정 오라클자바…01-31986
49 [평일주간,평일야간,주말]Spring,MyBatis,Hibernate개발자과정 오라클자바…01-191294
48 [평일주간,평일야간,주말]안드로이드개발자과정 오라클자바…01-111137
47 [평일야간,주말주간]JAVA,Network&WEB&Framework 오라클자바…01-031634
46 기업100%환급/오라클/자바/스프링/안드로이드/닷넷C#/웹퍼블리싱… 오라클자바…12-271894
45 [평일야간,주말]자바기초에서JSP,Ajax,jQuery,Spring3.2,MyBatis… 오라클자바…12-191401
44 웹퍼블리싱 마스터(HTML5,CSS3,jQUERY,AJAX,JavaScript) 오라클자바…12-141378
43 [채용예정교육]오라클자바개발잘하는신입뽑기2개월과정,교육전취… 오라클자바…12-111382
42 [평일,기업100%환급]자바기초에서 JDBC, Servlet/JSP까지 오라클자바…12-091112
41 [평일야간]닷넷(C#,Network,ADO.NET,ASP.NET)마스터 오라클자바…12-011302
40 [기업100%환급]C#4.0,WinForm,ADO.NET프로그래밍(평일주간(단기)… 오라클자바…12-011485
39 [평일야간,주말]SQL기초에서실무까지(SQL기초,PLSQL,힌트,튜닝) 오라클자바…12-01984




댓글 없음:

댓글 쓰기