2012-12-18 4 views
1

긴 트랜잭션의 일부인 SQL 문에 문제점이 있습니다."테이블이있을 경우 업데이트"를 한 문장으로 - 어떻게?

UPDATE tab_1 LEFT JOIN tab_2 ON tab_1.id = tab_2.tab_1_id SET tab_1.something = 42 WHERE tab1.id = tab_2.tab_1_id;

모든 것이 간단하고 분명하다 tab_1 및 tab_2 데이터베이스에 존재로 잘 한 작동합니다. ;-)

문제는 트랜잭션이 4 개 개의 다른 서버에 최선을 다하고 될 것을, 그리고 tab_2 특정 DB/DB 스키마에 존재하거나하지 않을 수 있습니다 "동적"테이블, ...

하는 경우입니다 tab_2가 없으면 데이터베이스에서 예외가 발생하여 전체 트랜잭션이 커밋되지 않습니다. 내가 원한 것은 어쨌든 계속 진행하는 것입니다 (그냥 0 행을 업데이트하십시오)!

나는 이런 식으로 뭔가를 시도 :

UPDATE [all the same as above] WHERE tab1.id = tab_2.tab_1_id AND EXISTS (select 1 from pg_class where relname='tab_2');

을 ... 그러나 "예외가 검사"전에 이루어지기 때문에, 여전히 잘못 "여기서"조건 (우리가 사용하고자하는 동일한 테이블의 가입 ..).

"순수한"SQL을 사용하는 방법이 있습니까? :) 같은

뭔가 : LEFT는 tab_2이있는 경우 tab_2 가입 (그렇지 않은 경우 - 아무것도하지 않는 등, null를 돌려?)

을 내가 PL/pgSQL의 절차에서이 작업을 수행 할 수있는 방법이 알고있다. 두 번째 가능성은 문이 있기 전에 테이블이 존재하지 않는다면 생성하는 것입니다.

한 문장에서 간단하고 우아한 방법이있을 수 있습니까? :)

DBMS : PostgreSQL의 9.2

답변

2

나는 존재하지 않는 테이블이 간단하고 우아한 경우에도 성공 UPDATE 문을 생각하지 않습니다. 나는 그것이 이상하고 혼란 스럽다고 생각한다.

테이블이 있는지 여부를 확인하고 존재하는 경우에만 업데이트를 수행하는 조건을 포함하면 안됩니까? 훨씬 더 명확해질 것입니다.

또 다른 옵션은 존재하는 경우 tab_2을 가리키는보기를 작성하거나 그렇지 않은 경우 빈 표를 가리키는 것입니다. 이 같은 쿼리가 많이 있고 모두 변경하지 않으려는 경우 유용 할 수 있습니다.

업데이트 : 여기이 조건은 다음과 같은 형태가 될 것이다 (함수 나 BEGIN...END 블록 내이어야한다) :

IF EXISTS (select 1 from pg_class where relname='tab_2') THEN 
    UPDATE... 
END IF; 

PostgreSQL을의 세부 사항에 따라이 아직도 경우 컴파일을 실패 할 수 있습니다 UPDATE 문에 존재하지 않는 테이블을 봅니다 (저는 PostgreSQL 사용자가 아닙니다). 이 경우 존재하는 경우 tab_2을 가리키는보기를 작성해야하며 존재하지 않으면 빈 표를 작성해야합니다.

+0

특정 조건에서만 점검하고 업데이트하는 것이 더 나은 해결책입니다 그리고 난 정말, 정말 이렇게하고 싶어 .. :)하지만 .. 어떻게? 어쩌면 그것은 어리석은 질문입니다 .. 지금 결과없이 EXISTS가있을 때 업데이트 케이스를 사용하려고합니다. 복잡한 조건을 사용할 수 없다고 생각합니다. 내가 잘못 생각한가요? – cathulhu

관련 문제