Sunday, April 25, 2010

ORA-01752: cannot delete from view without exactly one key-preserved table



delete 문 같은 경우에는 대상이 되는 table을 아래 쿼리와 같이 조인하여 사용하는 경우가 있을 수 있다.


DEPT TABLE의 PK는 dept_no 이고, 
EMP TABLE의 PK는 emp_no, fac_no 이다.


delete from (select name, age, b.dept_name
                       from emp a, dept b
                   where a.dept_no =  b.dept_no 
                      and b.dept_name = 'Service');


이렇게 쿼리를 작성하면 'Service' 부서에 속한 모든 EMP TABLE의 요소들이 삭제된다.

근데 만약 대상에 대해서 key preserved table이 존재하지 않는다면 표제와 같은 Oracle 에러가 발생한다.

ORA-01752: cannot delete from view without exactly one key-preserved table

한마디로 key-preserved 한 table이 없어서 이 쿼리는 사용할 수 없다는 뜻이다.
key-preserved table은 쉽게 생각해서 1:n 관계에서 Join 문을 만들어서 select 쿼리를 수행할 때 특정 table의 Row들이 중복되지 않고 유일성을 유지하는 경우를 말한다.여기서 중요한 것은 실제로 Row들이 중복되지 않고 나오느냐가 아니다. Join 구조 안에서 모든 PK를 서로 물고 있느냐는 것이다.

한마디로 프로그래머의 실수로 인해서 중복 Row가 생길 수가 없는 구조를 말한다. 그러한 두개의 table이 서로간의 PK를 맞물었을 때 ORA-1752는 없어진다. 즉, 예초부터 DB 설계가 잘못되어 있다면 delete 쿼리를 Join구조로 사용할 수가 없다.

잘못된 구조의 예를 한번 만들어 봤다.


DEPT TABLE의 PK는 dept_no, dept_pos 이고, 
EMP TABLE의 PK는 emp_no, fac_no 이다.

delete from (select name, age, b.dept_name
                       from emp a, dept b
                   where a.dept_no =  b.dept_no 
                      and b.dept_name = 'Service');

이 경우 dept_pos는 EMP table과 아무런 관계도 맺지 않는다. 즉 PK가 두개인 DEPT TABLE은 dept_no 정보가 같은 Row가 얼마든지 존재할 가능성이 있고(실제로 DB내용은 그렇지 않다해도 아무 상관도 없다), 즉 key-preserved table이어야 하는 EMP TABLE은 여러개의 중복 Row가 Return 될 수 있다. 실제로 쿼리를 동작시켰을 때 중복되느냐 아니냐는 전혀 관심사가 아니다. 구조적인 문제다.








No comments:

Post a Comment

주사위 놀이

Busan city, South Korea
All about programming knowledge such as Java, Flex and Oracle DB Management.

Followers