강좌
클라우드/리눅스에 관한 강좌입니다.
데이터베이스 분류

제약조건(constraint)를 위반하는 행(row) 알아내기

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

제약조건(constraint)를 위반하는 행(row) 알아내기
 
아래의 예에서는 제약조건인 primary key를 disable하고 데이터들을 삽입한 후,다시 primary key제약조건을 enable했을 경우에 대해 알아본다.enable이 실패했을 경우 어떠한 이유로 실패했는지 파악하고 이를 해결하는 방법을 알아본다.
SQL> create table test
  2  (
  3  name varchar2(10),
  4  age number(2)
  5  );
테이블이 생성되었습니다.
SQL> alter table test
  2  add constraint test_name_pk primary key(name);
테이블이 변경되었습니다.
SQL> insert into test values('강명규', 26);
1 개의 행이 만들어졌습니다.
SQL> insert into test values('홍길동', 30);
1 개의 행이 만들어졌습니다.
SQL> alter table test
  2  disable constraint test_name_pk;
테이블이 변경되었습니다.

SQL> @?/rdbms/admin/utlexcpt
테이블이 생성되었습니다.
SQL> select * from tab;
TNAME                          TABTYPE  CLUSTERID                                                                                       
------------------------------ ------- ----------                                                                                       
CHAINED_ROWS                   TABLE                                                                                                    
EXCEPTIONS                     TABLE                                                                                                    
PLAN_TABLE                     TABLE                                                                                                    
S_CUSTOMER                     TABLE                                                                                                    
S_DEPT                         TABLE                                                                                                    
S_EMP                          TABLE                                                                                                    
S_IMAGE                        TABLE                                                                                                    
S_INVENTORY                    TABLE                                                                                                    
S_ITEM                         TABLE                                                                                                    
S_LONGTEXT                     TABLE                                                                                                    
S_ORD                          TABLE                                                                                                    
S_PRODUCT                      TABLE                                                                                                    
S_REGION                       TABLE                                                                                                    
S_TITLE                        TABLE                                                                                                    
S_WAREHOUSE                    TABLE                                                                                                    
TEST                           TABLE                                                                                                    
16 개의 행이 선택되었습니다.
SQL> desc exceptions
 이름                            Null?    유형
 ------------------------------- -------- ----
 ROW_ID                                   ROWID
 OWNER                                    VARCHAR2(30)
 TABLE_NAME                               VARCHAR2(30)
 CONSTRAINT                               VARCHAR2(30)
SQL> insert into test values('', 27);
1 개의 행이 만들어졌습니다.
SQL> alter table test
  2  enable constraint test_name_pk
  3  exceptions into exceptions;
alter table test
*
1행에 오류:
ORA-02437: 

SQL> select * from exceptions;
ROW_ID             OWNER                          TABLE_NAME                     CONSTRAINT                                             
------------------ ------------------------------ ------------------------------ ------------------------------                         
AAAAfGAAFAAAACeAAA KANG                           TEST                           TEST_NAME_PK                                           
AAAAfGAAFAAAACeAAC KANG                           TEST                           TEST_NAME_PK                                           

SQL> select e.constraint, x.name
  2  from exceptions e, test x
  3  where e.row_id=x.rowid;
CONSTRAINT                     NAME                                                                                                     
------------------------------ ----------                                                                                               
TEST_NAME_PK                   강명규                                                                                                   
TEST_NAME_PK                   강명규                                                                                                   
SQL> select * from test;
NAME              AGE                                                                                                                   
---------- ----------                                                                                                                   
             26                                                                                                                   
홍길동             30                                                                                                                   
             27                                                                                                                   
SQL> delete from test where age=27;
1 행이 삭제되었습니다.
SQL> alter table test
  2  enable constraint test_name_pk;
테이블이 변경되었습니다.
			

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,042 명
  • 현재 강좌수 :  35,846 개
  • 현재 접속자 :  97 명