참고글 및 문제해결/문제해결

참조키 걸려고 할때 부모컬럼의 자료와 자식컬럼의 자료가 맞지 않아서 이어지지 않는 경우 (; exception테이블, spool, vi로 파일비교 사용예제포함)

에몽이ㅋ 2012. 2. 21. 10:04
account 에 여러 자료 입력 후
account에서 다시 bcode(code)를 참조해서 참조키 연결 시 문제
SQL> insert into account(code) values('WOW');   << bcode(code)에는 없는 자료입니다.
SQL> commit;


SQL> alter table account
  2  add constraint account_code_fk
  3  foreign key(code)
  4  references bcode(code);
add constraint account_code_fk
               *
ERROR at line 2:
ORA-02298: cannot validate (KOO.ACCOUNT_CODE_FK) - parent keys not found

(이어지지 않습니다.)

--> EXCEPTION table을 이용해봅시다.
EXCEPTION table 생성 후 확인
SQL> @?/rdbms/admin/utlexcpt.sql

Table created.
SQL> alter table account
  2  add constraint account_code_fk
  3  foreign key(code)
  4  references bcode(code);
add constraint account_code_fk
               *
ERROR at line 2:
ORA-02298: cannot validate (KOO.ACCOUNT_CODE_FK) - parent keys not found


SQL> select rowid, code from account
  2  where rowid in(select row_id from exceptions);

no rows selected

SQL> select * from exceptions;

no rows selected


** 아마도 foreign key 자체가 성립이 되지 않다보니까
exception에도 아예 들어가지 않았나봅니다.
수정 --> 위 실습 때는 exceptions into exceptions 를 적어주지 않아서,
 
exception안에 오류난 값들이 들어가지 않았고,  
실제로는
쿼리 마지막에 exceptions into exceptions 라고 추가해주면 exceptions테이블에
오류난 부분이 들어가게 됩니다. 



차선책(자료를 비교)
SQL> set heading off
SQL> spool bcode_code.txt
SQL> select code from bcode order by 1;
DG
HK
KB
WOO

SQL> spool off
SQL> spool account_code.txt
SQL> select distinct code from account order by 1;
DG
KB
WOW

SQL> spool off

하면 해당 결과들이 각 파일에 저장됩니다.

이후 각각의 파일들을 약간 편집 후
vi -d account_code.txt bcode_code.txt 하여 두파일을 비교해서 table을 수정하시기 바랍니다.
(vi 안에서 창 변환 Ctrl+W