병합

병합 - 테이블의 행을 조건부 삽입, 업데이트 또는 삭제

시놉시스

[withWith_Query[, ...]]target_table_name[ *] [[as]target_alias]data_sourceonjoin_condition
when_clause[...]output_expression[[as]output_name] [, ...]]어디data_sourceIS :[전용]source_table_name[ *] | (Source_Query) [[as]source_alias ]

andwhen_clauseIS :일치 할 때 [and조건] 그런 다음merge_update | merge_delete| 아무것도하지 않습니다 |조건] 그런 다음merge_update | merge_delete| 아무것도하지 않습니다 |조건] 그런 다음merge_insert| 아무것도하지 않아andmerge_insertIS :삽입 [(column_name[, ...])]표현| 기본값 [, ...]) |andmerge_updateIS :업데이트 세트column_name = { 표현| 기본값 |column_name[, ...]) = [row] (표현| 기본값 [, ...]) |column_name[, ...]) = (Sub-Select)andmerge_deleteIS :삭제

설명

병합식별 된 대상 토토 캔에서 행을 수정하는 동작을 수행합니다target_table_name, 사용data_source. 병합단일 제공SQL조건부로 할 수있는 진술삽입, 업데이트또는삭제행, 여러 절차 언어 진술이 필요한 작업.

먼저병합명령에서 join을 수행합니다data_source0 이상의 후보 변경 행을 생성하는 대상 토토 캔에. 각 후보 변경 행에 대해의 상태일치, 소스와 일치하지 않음또는[대상별로] 일치하지 않음한 번만 설정 한 후when조항은 지정된 순서로 평가됩니다. 각 후보 변경 행에 대해 TRUE로 평가하는 첫 번째 조항이 실행됩니다.when조항은 후보 변경 행에 대해 실행됩니다.

병합행동은 정기적 인 것과 동일한 효과를냅니다업데이트, 삽입또는삭제같은 이름의 명령. 해당 명령의 구문은 다릅니다. 특히여기서절과 토토 캔 이름이 지정되지 않습니다. 모든 동작은 대상 토토 캔을 참조하지만 다른 토토 캔에 대한 수정은 트리거를 사용하여 이루어질 수 있습니다.

언제아무것도하지 않습니다지정되어 소스 행이 건너 뜁니다. 행동이 지정된 순서로 평가되므로아무것도하지 않습니다더 세밀한 취급 처리 전에 비 관심있는 소스 행을 건너 뛰는 데 유용 할 수 있습니다.

선택 사항반환절의 원인병합삽입, 업데이트 또는 삭제 된 각 행을 기반으로 값을 계산하고 반환합니다. 소스 또는 대상 테이블의 열을 사용한 모든 표현식 또는merge_action ()함수를 계산할 수 있습니다.삽입또는업데이트동작이 수행되면 대상 토토 캔 열의 새 값이 사용됩니다. A삭제가 수행되면 대상 토토 캔 열의 기존 값이 사용됩니다. 의 구문반환목록은 출력 목록의 목록과 동일합니다select.

별도의 것이 없습니다병합특권. 업데이트 작업을 지정하면가 있어야합니다.업데이트|SET절. 삽입 작업을 지정하면가 있어야합니다.삽입대상 테이블의 권한. 삭제 조치를 지정하면가 있어야합니다.삭제대상 토토 캔의 권한. A를 지정하는 경우아무것도하지 않습니다행동, 당신은가 있어야합니다.select대상 토토 캔의 최소 한 열의 특권. 당신은 또한 필요합니다select의 모든 열의 특권data_source및 대상 표의조건(포함join_condition) 또는표현. 권한은 명세서 시작시 한 번 테스트되며 특정 여부를 확인합니다when조항이 실행됩니다.

병합대상 테이블이 구체화 된보기, 외국 표, 또는 규칙에 정의 된 규칙이있는 경우 지원되지 않습니다..

매개 변수

With_Query

thewith절에서 이름으로 언급 할 수있는 하나 이상의 하위 쿼리를 지정할 수 있습니다.병합쿼리. 보다PostgreSQL : 문서 : 17 : 7.8. 스포츠 토토 사이트와 함께 (공통 테이블 표현식)andselect자세한 내용. 참고재귀병합.

target_table_name

대상 테이블의 이름 (선택적으로 스키마 자격) 또는 병합보기. 만약에전용테이블 이름 앞에 지정되어 있으며, 일치 행이 명명 된 테이블에서만 업데이트되거나 삭제됩니다. 만약에전용지정되지 않았으며, 일치 행은 이름이 지정된 테이블에서 상속되는 테이블에서 업데이트되거나 삭제됩니다. 선택적으로,*토토 캔 이름 후에 지정하여 자손 토토 캔이 포함되어 있음을 명시 적으로 표시 할 수 있습니다. 그만큼전용키워드 및*옵션 삽입 동작에 영향을 미치지 않으며 항상 이름이 지정된 테이블에만 삽입됩니다.

iftarget_table_name보기입니다. NO로 자동 업데이트 할 수 있어야합니다대신트리거 또는 가져야합니다대신모든 유형의 행동에 대한 트리거 (삽입, 업데이트삭제) 지정when조항. 규칙이있는 견해는 지원되지 않습니다.

target_alias

대상 토토 캔의 대체 이름. 별칭이 제공되면 토토 캔의 실제 이름을 완전히 숨 깁니다.foo로 foo로 합병하여 f, 나머지병합진술은이 표를로 언급해야합니다.fnotfoo.

source_table_name

소스 테이블,보기 또는 전환 테이블의 이름 (선택적으로 스키마 자격). 만약에전용테이블 이름 앞에 지정되어 있으며, 일치 행은 명명 된 테이블에서만 포함됩니다. 만약에전용지정되지 않았으며, 일치 행은 이름이 지정된 테이블에서 상속되는 테이블에서도 포함됩니다. 선택적으로,*토토 캔 이름 후에 지정하여 자손 토토 캔이 포함되어 있음을 명시 적으로 표시 할 수 있습니다.

Source_Query

query (selectStatement 또는statement) 대상 테이블에 병합 될 행을 제공하는 것. 참조selectStatement 또는구문 설명에 대한 명령문.

source_alias

데이터 소스의 대체 이름. 별칭이 제공되면 토토 캔의 실제 이름이나 쿼리가 발행되었다는 사실을 완전히 숨 깁니다.

join_condition

join_condition유형의 값을 초래하는 표현식입니다부울(A와 유사여기서절)에서 어떤 행을 지정하는.data_source대상 테이블의 행을 일치시킵니다.

경고

일치하려는 대상 테이블의 열만data_source행에 행이 나타나야합니다join_condition. join_condition대상 테이블의 열만 참조하는 하위 표현은 종종 놀라운 방식으로 어떤 조치를 취할 수 있는지에 영향을 줄 수 있습니다.

둘 다소스와 일치하지 않을 때and[target에 의해] 일치하지 않을 때조항이 지정되어 있습니다.병합명령은 a를 수행합니다.full사이에 가입data_source및 대상 토토 캔. 이것이 작동하기 위해서는 적어도 하나join_conditionSubexpression은 해시 조인을 지원할 수있는 연산자를 사용해야합니다. 그렇지 않으면 모든 하위 표현은 병합 조인을 지원할 수있는 연산자를 사용해야합니다.

when_clause

적어도 하나when조항이 필요합니다.

thewhen조항은 지정할 수 있습니다일치 할 때, 소스와 일치하지 않을 때또는[target에 의해] 일치하지 않을 때.SQL표준 전용 정의일치 할 때and일치하지 않을 때(일치하는 대상 행을 의미하지 않도록 정의 됨).소스와 일치하지 않을 때에 대한 확장입니다.SQL표준, 추가 옵션대상to일치하지 않을 때, 그 의미를보다 명확하게 만들려면

when조항을 지정합니다일치 할 때그리고 후보 변경 행은에서 행과 일치합니다.data_source대상 테이블의 행으로when조항이 실행되면조건결석하거나 평가합니다true.

when조항을 지정합니다소스와 일치하지 않을 때그리고 후보 변경 행은 대상 테이블의 행을 나타냅니다.data_source, Thewhen조항이 실행되면조건결석하거나 평가합니다true.

when조항을 지정합니다[target에 의해] 일치하지 않을 때그리고 후보 변경 행은의 행을 나타냅니다.data_source대상 테이블의 행과 일치하지 않는when조항이 실행되면조건결석하거나 평가합니다true.

조건

유형 값을 반환하는 표현식부울. A에 대한이 표현이 있다면when절이 반환true, 그러면 해당 조항에 대한 조치가 해당 행에 대해 실행됩니다.

a일치 할 때절은 소스와 대상 관계의 열을 참조 할 수 있습니다. A의 상태소스와 일치하지 않을 때절은 정의에 따라 일치하는 소스 행이 없기 때문에 대상 관계의 열만 참조 할 수 있습니다. A의 상태[target에 의해] 일치하지 않을 때절은 정의에 따라 일치하는 대상 행이 없기 때문에 소스 관계의 열만 참조 할 수 있습니다. 대상 테이블의 시스템 속성 만 액세스 할 수 있습니다.

merge_insert

AN의 사양삽입한 행을 대상 테이블에 삽입하는 동작. 대상 열 이름은 어떤 순서로든 나열 될 수 있습니다.

명시 적 또는 암시 적 열 목록에 존재하지 않는 각 열에는 기본값이 채워집니다.

대상 테이블이 분할 된 테이블 인 경우 각 행은 적절한 파티션으로 라우팅되어 삽입됩니다. 대상 테이블이 파티션 인 경우 입력 행이 파티션 제약 조건을 위반하면 오류가 발생합니다.

열 이름이 두 번 이상 지정되지 않을 수 있습니다.삽입동작은 하위 선택을 포함 할 수 없습니다.

하나만절을 지정할 수 있습니다. 그만큼조항은 정의에 따라 대상 행이 일치하지 않기 때문에 소스 관계의 열만 참조 할 수 있습니다.

merge_update

AN의 사양업데이트대상 테이블의 현재 행을 업데이트하는 조치. 열 이름은 두 번 이상 지정되지 않을 수 있습니다.

토토 캔 이름이나 A여기서조항이 허용됩니다.

merge_delete

지정삭제대상 테이블의 현재 행을 삭제하는 동작. 일반적으로 A와 같이 테이블 이름이나 다른 조항을 포함하지 마십시오.삭제명령.

column_name

대상 테이블의 열 이름. 열 이름은 필요한 경우 하위 필드 이름 또는 배열 첨자로 자격을 갖추 수 있습니다.

시스템 가치 재정의

이 조항이 없으면 명시 적 값을 지정하는 것은 오류입니다 (기본값) 정의 된 신원 열에 대한항상 생성. 이 조항은 해당 제한을 무시합니다.

사용자 값 재정

이 조항이 지정된 경우 정의 된 신분 열에 제공되는 값기본적으로 생성무시되고 기본 시퀀스 생성 값이 적용됩니다.

기본값

모든 열에는 기본값으로 채워집니다. (an재정의조항은이 양식에서 허용되지 않습니다.)

표현

열에 할당하는 표현식. A에서 사용되는 경우일치 할 때절에서, 표현식은 대상 테이블의 원래 행에서 값을 사용할 수 있고data_source행. A에서 사용되는 경우소스와 일치하지 않을 때절에서 표현식은 대상 테이블의 원래 행에서만 값을 사용할 수 있습니다. A에서 사용되는 경우[target에 의해] 일치하지 않을 때절, 표현식은에서만 값 만 사용할 수 있습니다.data_sourceRow.

기본값

열을 기본값으로 설정합니다 (NULL특정 기본 표현식이 할당되지 않은 경우).

Sub-Select

A select이전의 괄호 화 된 열 목록에 나열된 많은 출력 열을 생성하는 하위 쿼리. 하위 쿼리는 실행될 때 1 행을 넘어서는 안됩니다.일치 할 때절에서 하위 쿼리는 대상 테이블의 원래 행의 값을 참조 할 수 있고의 값을 참조 할 수 있습니다.data_source행. A에서 사용되는 경우소스와 일치하지 않을 때절에서 하위 쿼리는 대상 테이블의 원래 행의 값 만 참조 할 수 있습니다.

output_expression

계산 및 반환 할 표현식병합각 행 변경 후 명령 (삽입, 업데이트 또는 삭제 여부). 표현식은 소스 또는 대상 테이블의 열 또는의 열을 사용할 수 있습니다.merge_action ()실행 된 작업에 대한 추가 정보를 반환 할 수있는 기능.

쓰기*소스 테이블에서 모든 열을 반환하고 대상 테이블의 모든 열이 뒤 따릅니다. 소스 및 대상 테이블이 동일한 열을 많이 갖는 것이 일반적이기 때문에 종종 많은 복제로 이어질 것입니다.*소스 또는 대상 테이블의 이름 또는 별칭이 포함되어 있습니다.

output_name

반환 된 열에 사용할 이름.

출력

성공적인 완료시, A병합명령은 양식의 명령 태그를 반환

병합Total_Count

theTotal_Count총 행이 변경되었는지 (삽입, 업데이트 또는 삭제하든). 만약에Total_Countis 0, 어떤 식 으로든 행이 변경되지 않았습니다.

병합명령이 포함되어반환절에서 결과는 a의 결과와 유사합니다.select반환명령에 의해 삽입, 업데이트 또는 삭제 된 행 위에 계산 된 목록.

노트

다음 단계는 실행 중에 발생합니다병합.

  1. 성능이전 명령문지정된 모든 조치에 대한 트리거whenClauses Match.

  2. 소스에서 대상 테이블로 조인을 수행합니다. 결과 쿼리는 정상적으로 최적화되며 일련의 후보 변경 행을 생성합니다.

    1. 각 행이 있는지 평가합니다일치, 소스와 일치하지 않음또는[대상별로] 일치하지 않음.

    2. 각각 테스트when진실이 반환 될 때까지 지정된 순서의 조건.

    3. 조건이 진실을 반환하면 다음 조치를 수행하십시오.

      1. 성능전 행액션의 이벤트 유형에 대한 발사 트리거.

      2. 지정된 조치를 수행하여 대상 테이블에서 확인 제약 조건을 호출합니다.

      3. 성능After Row액션의 이벤트 유형에 대한 발사 트리거.

      대상 관계가보기 인 경우대신 행액션의 이벤트 유형에 대한 트리거, 대신 작업을 수행하는 데 사용됩니다.

  3. 성능이후의 진술실제로 발생하는지 여부에 관계없이 지정된 작업에 대한 트리거. 이것은 an의 행동과 유사합니다업데이트행을 수정하지 않는 진술.

요약하면, 이벤트 유형에 대한 명세서 트리거 (예 :삽입) 우리가 언제마다 해고 될 것입니다지정그런 종류의 행동. 대조적으로,로드 레벨 트리거는 특정 이벤트 유형에 대해서만 발사됩니다실행. 그래서 A병합Command가 Fire Statement Triggers 둘 다에 대한 Triggers업데이트and삽입업데이트행 트리거가 해고되었습니다.

가입이 각 대상 행에 대해 최대 하나의 후보 변경 행을 생성해야합니다. 다시 말해, 대상 행은 둘 이상의 데이터 소스 행에 결합해서는 안됩니다.병합. 반복적 인 행동이 인 경우삽입, 이로 인해 고유성 위반이 발생하지만 반복업데이트또는삭제추기경 위반을 일으킬 것입니다. 후자의 행동은에 의해 필요합니다.SQL표준. 이것은 역사적으로 다릅니다PostgreSQL조인 동작에서업데이트and삭제동일한 행을 수정하려는 두 번째 및 후속 시도가 단순히 무시되는 진술.

if awhen조항은 an을 생략합니다.하위 클라스, 그것은 그러한 종류의 최종 도달 조항이됩니다 (일치, 소스와 일치하지 않음또는[대상별로] 일치하지 않음). 나중에when그러한 종류의 조항은 지정 될 수 없으며 오류가 발생합니다. 최종 도달 조항이 어느 한 종류로 지정되지 않으면 후보 변경 행에 대한 조치를 취하지 않을 수 있습니다.

데이터 소스에서 행이 생성되는 순서는 기본적으로 불확실합니다. 에이Source_Query필요한 경우 일관된 순서를 지정하는 데 사용될 수 있으며, 이는 동시 거래 사이의 교착 상태를 피하기 위해 필요할 수 있습니다.

언제병합대상 테이블을 수정하는 다른 명령과 동시에 실행됩니다. 일반적인 트랜잭션 격리 규칙이 적용됩니다. 보다섹션 13.2각 격리 수준에서 동작에 대한 설명. 사용을 고려하고 싶을 수도 있습니다.삽입 ... 충돌실행 능력을 제공하는 대안 진술로서업데이트동시에삽입발생합니다. 두 문장 유형 사이에는 다양한 차이점과 제한이 있으며 교환 할 수 없습니다.

예제

유지 보수 수행customer_accounts신규 기반최근_transactions.

Customer_Account Ca로 병합

이것은 다음 진술과 정확히 동일하다는 것을 알 수 있습니다.일치실행 중에 결과가 변경되지 않습니다.

Customer_Account Ca로 병합

재고량과 함께 새 재고 품목을 삽입하려고 시도합니다. 항목이 이미 존재하는 경우 대신 기존 품목의 재고 수를 업데이트하십시오.

와인으로 합병 w

theWine_stock_changes예를 들어 최근 데이터베이스에로드 된 임시 토토 캔이 될 수 있습니다.

업데이트와인교체 와인리스트를 기준으로 새 재고에 대한 행을 삽입하고, 수정 된 재고 항목을 업데이트하고, 새 목록에없는 와인을 삭제합니다.

와인으로 합병 w

호환성

이 명령은에 부합합니다.SQL표준.

thewith절,소스and대상예선일치하지 않을 때, 아무것도하지 않습니다행동,반환조항은에 대한 확장입니다.SQL표준.

정정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면