키 보존 테이블 개념이란 무엇입니까?


12

조인 뷰 업데이트 섹션의 키 보존 테이블에 대한 Oracle 설명서를 읽었습니다.

그러나 나는 그것을 이해하는 간단한 방법을 찾지 못했습니다.

공식 Oracle Documentation 이외의 간단한 개념적 세부 정보를 받고 싶습니다.


1
AskTom 에서 이것을 보셨습니까 ?
잭 topanswers.xyz 시도라고

이 까다로운 개념을 이해하게 한 또 다른 설명이 있습니다 : dba.stackexchange.com/questions/38728/…
Vadzim

답변:


7

키 보존은 1 개의 키 값이 1 개의 테이블로 이동 함을 의미합니다. 카운터 예제를 제공하면이 개념을 더 잘 이해하는 데 도움이 될 수 있습니다.

예 1 :

보기에 집계가 포함되어 있습니다. 다음과 같은 뷰 구조가 있다고 가정하십시오.

GroupID, AverageSalary
1 , 10000
2, 12000
3, 14000

이 예에서 : 값이 둘 이상의 행에서 나옵니다. 이보기에서 AverageSalary를 업데이트하려고하면 데이터베이스에서 업데이트 할 WHICH 행을 찾을 수 없습니다.

예 2 : 뷰에 둘 이상의 테이블 값이 표시됩니다. 뷰에는 PERSON 및 PERSON_CONTACT_DETAILS (ID, PersonID, ContactType, ContactValue) 테이블의 값이 표시됩니다.

행 예 :

 1,1,email,ddd@example.com
 1,1,phone,898-98-99

이 2 개의 테이블에 가입하면보다 비즈니스 친화적 인 정보를 볼 수 있습니다.

PersonId, 이름, 성, Phone1, Email1

여기에서 Phone1 및 Email1을 업데이트하려고합니다. 그러나이 예제에서 personID는 두 개의 다른 행에 맵핑되며 더 많은 행일 수 있습니다. 이보기에서 데이터베이스는 업데이트 할 WHICH 행을 찾을 수 없습니다.

참고 :보기 SQL을 제한하고 업데이트 할 행을 분명하게 찾으면 작동 할 수 있습니다.

이 두 가지 예는 내 생각에 오는 첫 번째 예입니다. 그들은 증가 될 수 있습니다. 그러나 개념은 분명하다. 데이터베이스는 1 개의 키 값을 1 개의 테이블에 매핑해야합니다. 예를 들어 PERSON, PERSON_DETAILS 테이블이 일대일입니다. 보기 및 업데이트는 일대일이므로 작동합니다.


업데이트하려는 테이블에 복합 기본 키가 포함되어 있으면 어떻게합니까?
johny 왜

7

문서를 이미 읽고 꽤 잘 말한다. 추가 설명 :

키 보존 테이블의 개념은 조인 뷰 수정에 대한 제한 사항을 이해하는 데 필수적입니다.

일반적으로 update단일 테이블 에서 작동합니다. 필터에서 왜곡 된 서브 쿼리를 피하기 위해 Oracle은 update변경 사항을 테이블의 실제 기본 행에 쉽게 맵핑 할 수있는 한 뷰 (또는 서브 쿼리)를 허용 합니다. set절이 '키 보존'테이블의 열만 수정 하는 경우 가능 합니다.

테이블의 모든 키가 조인 결과의 키일 수있는 경우 테이블은 키 보존됩니다. 따라서 키 보존 테이블은 조인을 통해 키가 보존됩니다.

예를 들면 다음과 같습니다.

create table foo( foo_id integer primary key, foo_val integer not null );
create table bar( bar_id integer primary key, bar_val integer not null, 
                  foo_id integer not null references foo );

update (select * from foo join bar using(foo_id)) set foo_val=1;
ORA-01779: cannot modify a column which maps to a non key-preserved table

update (select * from foo join bar using(foo_id)) set bar_val=1;
0 rows updated.

오라클은 하나의 방법이 없기 때문에 첫 번째 업데이트가 실패 : 1 매핑 foo_val쿼리를에 foo_valfoo- 오라클은 1 할 수 있기 때문에 반대로 두 번째 업데이트가 성공 : 1 각지도 bar_valbar_valbar. 중요한 것은 foo_id고유 하다는 것입니다.에의 foo각 행에 대해 bar최대 하나의 해당 행만있을 수 있습니다 foo( 이 예에서는 실제로는 정확히 1이지만 널 입력 가능 외래 키에도 동일하게 적용됩니다. 요점은 하나 이상의 행).


3

먼저 예를 들어 설명해 드리겠습니다. 학생 (t_students)과 Course (t_course) 2 테이블을 고려하십시오.

  • 학생 테이블 (학생, 이름, 강좌)에는 학생 ID의 기본 키가 있습니다.
  • 강좌 테이블 (courseid, coursename)에는 강좌 ID에 대한 기본 키가 있습니다.

이 두 테이블이 결합되면->

select * from t_students S, t_course C where S.courseid=C.courseid; 

결과 데이터는 학생 테이블과 정확히 같은 수의 행을 갖습니다. 결과 집합에 studentid의 중복 값이 ​​없습니다 (학생 유지). 그러나 코스 테이블에서 코스 ID는 고유하지만 많은 학생들이 동일한 코스를 선택했을 수 있으므로 결과 세트에서 여러 번 반복됩니다 (즉, 코스 ID는 유지되지 않음).

이 예제를 사용하면 다음과 같은 결론을 얻을 수 있습니다.

  • 기본 테이블의 모든 키는 조인 (학생) 후 결과 데이터의 키 역할을합니다.
  • 기본 행의 행은 결과 데이터에 최대 한 번만 나타납니다 (중복 행 없음).

이것이 Key Preserved Tables의 개념입니다.

보기 열을 업데이트 할 수 있는지 확인하려면

select * from all_updatable_columns where table_name='V_VIEW_NAME';

추신 : 테이블 / 뷰 이름을 대문자로 제공하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.