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
'programing' 카테고리의 다른 글
MySQL INSERT IGNORE에 해당하는 Oracle? (0) | 2023.06.21 |
---|---|
superclass __init_ 메서드가 자동으로 호출되지 않는 이유는 무엇입니까? (0) | 2023.06.21 |
롤업 구성 파일에서 유형 스크립트를 지원합니까? (0) | 2023.06.21 |
SQL Server의 매개 변수 스푸핑(또는 스푸핑) (0) | 2023.06.21 |
SQL Server가 윈도우즈 응용 프로그램에서 "'NT AUTHORITY\ANNIMING LOGON' 사용자에 대해 로그인하지 못했습니다." 오류를 반환 (0) | 2023.06.21 |