조인 뷰 업데이트 섹션의 키 보존 테이블에 대한 Oracle 설명서를 읽었습니다.
그러나 나는 그것을 이해하는 간단한 방법을 찾지 못했습니다.
공식 Oracle Documentation 이외의 간단한 개념적 세부 정보를 받고 싶습니다.
조인 뷰 업데이트 섹션의 키 보존 테이블에 대한 Oracle 설명서를 읽었습니다.
그러나 나는 그것을 이해하는 간단한 방법을 찾지 못했습니다.
공식 Oracle Documentation 이외의 간단한 개념적 세부 정보를 받고 싶습니다.
답변:
키 보존은 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 테이블이 일대일입니다. 보기 및 업데이트는 일대일이므로 작동합니다.
문서를 이미 읽고 꽤 잘 말한다. 추가 설명 :
키 보존 테이블의 개념은 조인 뷰 수정에 대한 제한 사항을 이해하는 데 필수적입니다.
일반적으로 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_val
에 foo
- 오라클은 1 할 수 있기 때문에 반대로 두 번째 업데이트가 성공 : 1 각지도 bar_val
에 bar_val
에 bar
. 중요한 것은 foo_id
고유 하다는 것입니다.에의 foo
각 행에 대해 bar
최대 하나의 해당 행만있을 수 있습니다 foo
( 이 예에서는 실제로는 정확히 1이지만 널 입력 가능 외래 키에도 동일하게 적용됩니다. 요점은 하나 이상의 행).
먼저 예를 들어 설명해 드리겠습니다. 학생 (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';
추신 : 테이블 / 뷰 이름을 대문자로 제공하십시오.