programing

Oracle - 업데이트 가입 - 키가 보존되지 않은 테이블

bestprogram 2023. 6. 21. 22:48

Oracle - 업데이트 가입 - 키가 보존되지 않은 테이블

Oracle에 정확히 존재하지 않는 Ingres "update tbl1 from tbl2" 명령을 복제하려고 합니다.

그래서 저는 "update"를 사용합니다(tbl1 join tbl2 선택...)" 명령.두 테이블 모두 기본 키가 정의되어 있고 조인이 행을 고유하게 식별하는 것이라고 생각했지만 "ORA-01779: 키가 보존되지 않은 테이블에 매핑되는 열을 수정할 수 없습니다"라는 메시지가 계속 표시됩니다.

다음은 적절하게 익명화된 테이블 정의와 실행하려는 업데이트입니다.

CREATE TABLE tbl1
(
   ID decimal(11) NOT NULL,
   A varchar2(3) NOT NULL,
   B float(7),
   CONSTRAINT tbl1_pk PRIMARY KEY (ID,A)
)
;

CREATE TABLE tbl2
(
   ID decimal(11) NOT NULL,
   A varchar2(3) NOT NULL,
   B float(15),
   C float(15),
   D char(1) NOT NULL,
   CONSTRAINT tbl2_PK PRIMARY KEY (ID,A,D)
)
;

UPDATE 
  (select tbl1.b, tbl2.c 
   from tbl1 inner join tbl2 
   on tbl1.id=tbl2.id 
   and tbl1.a=tbl2.a 
   and tbl1.b=tbl2.b 
   and tbl1.a='foo' 
   and tbl2.D='a') 
set b=c;

Oracle이 고유성 위반이 없다고 만족하도록 선택 항목을 정의하려면 어떻게 해야 합니까?

상관된 하위 쿼리를 사용하여 이 작업을 수행할 수 있어야 합니다.

UPDATE tbl1 t1
   SET t1.b = (SELECT c
                 FROM tbl2 t2
                WHERE t1.id = t2.id
                  AND t1.a  = t2.a
                  AND t1.b  = t2.b
                  AND t2.d  = 'a')
 WHERE t1.a = 'foo'
   AND EXISTS( SELECT 1
                 FROM tbl2 t2
                WHERE t1.id = t2.id
                  AND t1.a  = t2.a
                  AND t1.b  = t2.b
                  AND t2.d  = 'a')

그 문제는UPDATE당신이 쓴 것은 오라클이 정확히 1개가 있다고 보장할 수 없다는 것입니다.tbl2.c단일에 해당하는 값tbl1.b값. 여러 행이 있는 경우tbl2에 있어서의 어떤 특정한 행에 대해서도.tbl1연관된 업데이트는 단일 행 하위 쿼리가 여러 행을 반환했음을 나타내는 오류를 발생시킵니다.이 경우 하위 쿼리에 논리를 추가하여 다음 행을 지정해야 합니다.tbl2사용할 수 있습니다.

기본 tbl1 테이블을 수정하려고 시도하고 tbl1 테이블이 뷰에서 키로 보존되지 않기 때문에 이 문은 오류와 함께 실패합니다(ORA-01779는 키로 보존되지 않은 테이블에 매핑되는 열을 수정할 수 없습니다). (ID,A)가 디프 테이블의 키이지만 조인의 키가 아니기 때문입니다.

(http://www.orafaq.com/tuningguide/updateable%20view.html) 에 따르면, 당신의 보기는 키로 표시된 보기가 아닌 것 같습니다.실제로 당신은 허용되지 않는 것처럼 보이는 기본 키가 아닌 가입을 합니다.

언급URL : https://stackoverflow.com/questions/9335536/oracle-update-join-non-key-preserved-table