병합

MERGE — 조건부로 스포츠 토토 결과 행 삽입, 업데이트 또는 삭제

시놉시스

[ 와with_query[, ...] ]
[만]으로 병합target_table_name[ * ] [ [ AS ]target_alias]
    사용data_source켜짐join_condition
    when_clause [...]

어디에서data_source다음은:[만 ]source_table_name [ * ] | ( source_query)  [ [ 그대로 ]source_alias ]

그리고when_clause다음은:일치하는 경우 [ AND조건] 그런 다음merge_update | merge_delete| 아무것도 하지 마세요  |
      일치하지 않는 경우 [ AND조건] 그런 다음merge_insert| 아무것도 하지 마세요그리고merge_insert다음은:삽입 [(열_이름[, ...] )]
        [ 재정의  시스템 | 사용자  값 ]
         값(표현| 기본값  [, ...] ) | 기본값그리고merge_update다음은:업데이트 세트열_이름 = { 표현| 기본값  |
                 (열_이름[, ...] ) = [ 행 ] (표현| 기본값  [, ...] ) |
                 (열_이름 [, ...] ) = ( 하위 SELECT )
               } [, ...]

그리고merge_delete다음은:삭제

설명

병합다음으로 식별된 대상 테이블의 행을 수정하는 작업을 수행합니다.target_table_name, 다음을 사용하여data_source. 병합단일 제공SQL조건부로 사용할 수 있는 명령문삽입, 업데이트또는삭제행, 그렇지 않으면 여러 절차적 언어 문이 필요한 작업입니다.

먼저,병합명령은 다음에서 조인을 수행합니다.data_source0개 이상의 후보 변경 행을 생성하는 대상 스포츠 토토 결과에. 각 후보 변경 행에 대해 상태는일치함또는일치하지 않음한 번만 설정되고 그 이후에는언제절은 지정된 순서대로 평가됩니다. 각 후보 변경 행에 대해 true로 평가되는 첫 번째 절이 실행됩니다. 1개 이하언제절은 모든 후보 변경 행에 대해 실행됩니다.

병합행동은 일반 행동과 동일한 효과를 가집니다.업데이트, 삽입, 또는삭제동일한 이름의 명령입니다. 해당 명령의 구문은 다릅니다. 특히 다음이 없습니다.어디절이 있고 스포츠 토토 결과 이름이 지정되지 않았습니다. 모든 작업은 대상 스포츠 토토 결과을 참조하지만 트리거를 사용하여 다른 스포츠 토토 결과을 수정할 수 있습니다.

언제아무것도 하지 않음이 지정되면 소스 행을 건너뜁니다. 작업은 지정된 순서로 평가되므로아무것도 하지 않음더 세밀하게 처리하기 전에 흥미롭지 않은 소스 행을 건너뛰는 것이 편리할 수 있습니다.

별도는 없습니다병합특권. 업데이트 작업을 지정하는 경우 다음이 있어야 합니다.업데이트에서 참조되는 대상 스포츠 토토 결과의 열에 대한 권한SET절. 삽입 작업을 지정하는 경우 다음이 있어야 합니다.삽입대상 테이블에 대한 권한. 삭제 작업을 지정하는 경우 다음이 있어야 합니다.삭제대상 스포츠 토토 결과에 대한 권한입니다. a를 지정하는 경우아무것도 하지 않음작업을 수행하려면 다음이 있어야 합니다.선택대상 스포츠 토토 결과의 하나 이상의 열에 대한 권한. 당신은 또한 필요합니다선택의 모든 열에 대한 권한data_source및 임의의 대상 스포츠 토토 결과에 대한조건(포함join_condition) 또는표현. 권한은 명령문 시작 시 한 번 테스트되며 특별한지 여부를 확인합니다.언제절이 실행됩니다.

병합대상 테이블이 구체화된 뷰, 외부 테이블이거나 정의된 규칙이 있는 경우 지원되지 않습니다.

매개변수

with_query

WITH절을 사용하면에서 이름으로 참조할 수 있는 하나 이상의 하위 쿼리를 지정할 수 있습니다.병합질의. 참조섹션 7.8그리고선택12573_12599재귀적 사용다음에서는 지원되지 않습니다.병합.

target_table_name

병합할 대상 테이블의 이름(선택적으로 스키마 한정). 만약에이 테이블 이름 앞에 지정되면 일치하는 행은 명명된 테이블에서만 업데이트되거나 삭제됩니다. 만일이 지정되지 않으면 명명된 테이블에서 상속되는 모든 테이블에서 일치하는 행도 업데이트되거나 삭제됩니다. 선택적으로,*스포츠 토토 결과 이름 뒤에 지정하여 하위 스포츠 토토 결과이 포함되어 있음을 명시적으로 나타낼 수 있습니다.키워드 및*옵션은 항상 명명된 테이블에만 삽입하는 삽입 작업에 영향을 주지 않습니다.

target_alias

대상 스포츠 토토 결과의 대체 이름입니다. 별칭이 제공되면 스포츠 토토 결과의 실제 이름이 완전히 숨겨집니다. 예를 들어, 주어진foo AS f로 병합, 나머지병합문은 이 테이블을 다음과 같이 참조해야 합니다.f아님foo.

source_table_name

소스 테이블, 뷰 또는 전환 테이블의 이름(선택적으로 스키마 한정). 만약에이 스포츠 토토 결과 이름 앞에 지정되어 있으며, 일치하는 행은 명명된 스포츠 토토 결과에서만 포함됩니다. 만일이 지정되지 않으면 명명된 테이블에서 상속되는 모든 테이블에서도 일치하는 행이 포함됩니다. 선택적으로,*스포츠 토토 결과 이름 뒤에 지정하여 하위 스포츠 토토 결과이 포함되어 있음을 명시적으로 나타낼 수 있습니다.

source_query

쿼리(선택성명 또는문)은 대상 테이블에 병합할 행을 제공합니다. 참조선택성명 또는구문 설명에 대한 설명입니다.

source_alias

데이터 소스의 대체 이름입니다. 별칭을 제공하면 스포츠 토토 결과의 실제 이름이나 쿼리가 실행되었다는 사실이 완전히 숨겨집니다.

join_condition

join_condition유형 값을 생성하는 표현식입니다.부울(a와 유사어디에서절)은의 행을 지정합니다.data_source대상 스포츠 토토 결과의 행과 일치합니다.

경고

일치하려는 대상 스포츠 토토 결과의 열만data_source행은 다음에 나타나야 합니다.join_condition. join_condition대상 테이블의 열만 참조하는 하위 표현식은 종종 놀라운 방식으로 수행되는 작업에 영향을 미칠 수 있습니다.

when_clause

적어도 하나언제절이 필요합니다.

만약언제절이 지정함일치하는 경우그리고 후보 변경 행은 대상 스포츠 토토 결과의 행과 일치합니다.언제다음과 같은 경우 절이 실행됩니다.조건없거나 다음과 같이 평가됨.

반대로 만약에언제절이 지정함일치하지 않는 경우그리고 후보 변경 행이 대상 테이블의 행과 일치하지 않습니다.언제다음과 같은 경우 절이 실행됩니다.조건없거나 다음과 같이 평가됨사실.

조건

유형의 값을 반환하는 표현식부울. 이 표현식이 a언제절 반환, 그러면 해당 절에 대한 작업이 해당 행에 대해 실행됩니다.

a의 조건일치하는 경우절은 소스 관계와 대상 관계 모두의 열을 참조할 수 있습니다. a에 대한 조건일치하지 않는 경우절은 정의에 따라 일치하는 대상 행이 없기 때문에 소스 관계의 열만 참조할 수 있습니다. 대상 스포츠 토토 결과의 시스템 속성에만 액세스할 수 있습니다.

merge_insert

의 사양삽입대상 테이블에 행 하나를 삽입하는 작업입니다. 대상 열 이름은 순서에 관계없이 나열될 수 있습니다. 열 이름 목록이 전혀 제공되지 않으면 기본값은 선언된 순서대로 테이블의 모든 열입니다.

명시적 또는 암시적 열 목록에 없는 각 열은 기본값으로 채워집니다. 선언된 기본값 또는 기본값이 없는 경우 null입니다.

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

열 이름은 두 번 이상 지정할 수 없습니다.삽입작업에는 하위 선택이 포함될 수 없습니다.

단 하나가치절을 지정할 수 있습니다.절은 정의에 따라 일치하는 대상 행이 없으므로 소스 관계의 열만 참조할 수 있습니다.

merge_update

an의 사양업데이트대상 테이블의 현재 행을 업데이트하는 작업입니다. 열 이름은 두 번 이상 지정할 수 없습니다.

스포츠 토토 결과 이름도 아니고 a도 아닙니다어디에서절이 허용됩니다.

merge_delete

a를 지정합니다삭제대상 테이블의 현재 행을 삭제하는 작업입니다. 일반적으로 a를 사용하는 것처럼 테이블 이름이나 다른 절을 포함하지 마십시오.삭제명령.

컬럼_이름

대상 테이블의 열 이름. 필요한 경우 하위 필드 이름이나 배열 첨자로 열 이름을 한정할 수 있습니다. (복합 컬럼의 일부 필드에만 삽입하면 나머지 필드는 null이 됩니다.) 대상 컬럼 지정에 테이블 이름을 포함하지 마십시오.

시스템 값 재정의

이 절 없이 명시적인 값을 지정하는 것은 오류입니다(기본값)로 정의된 ID 열의 경우항상 생성됨. 이 조항은 해당 제한을 무시합니다.

사용자 값 무시

이 절이 지정되면 다음과 같이 정의된 ID 열에 제공된 모든 값기본값으로 생성됨무시되고 기본 시퀀스 생성 값이 적용됩니다.

기본값

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

표현

열에 할당할 표현식입니다. a에서 사용되는 경우일치하는 경우절, 표현식은 대상 테이블의 원래 행 값과data_source행. a에서 사용되는 경우일치하지 않는 경우절, 표현식은의 값을 사용할 수 있습니다.data_source행.

기본값

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

하위 SELECT

A 선택앞의 괄호로 묶인 열 목록에 나열된 만큼의 출력 열을 생성하는 하위 쿼리입니다. 하위 쿼리는 실행 시 행을 1개 이상 생성해서는 안 됩니다. 하나의 행이 생성되면 해당 열 값이 대상 열에 할당됩니다. 행이 생성되지 않으면 대상 열에 NULL 값이 할당됩니다. 하위 쿼리는 대상 테이블의 원래 행 값과data_source행.

출력

성공적으로 완료되면, a병합명령은 다음 형식의 명령 태그를 반환합니다.

병합total_count

total_count은 변경된(삽입, 업데이트 또는 삭제 여부에 관계없이) 총 행 수입니다. 만일total_count은 0이며 어떤 행도 변경되지 않았습니다.

참고

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

  1. 아무거나 수행성명 전지정된 모든 작업에 대해 트리거됩니다.언제절이 일치합니다.

  2. 소스에서 대상 스포츠 토토 결과로 조인을 수행합니다. 결과 쿼리는 정상적으로 최적화되고 후보 변경 행 집합을 생성합니다. 각 후보 변경 행에 대해,

    1. 각 행이 다음과 같은지 평가합니다.일치함또는일치하지 않음.

    2. 각 테스트언제참을 반환할 때까지 지정된 순서대로 조건을 지정합니다.

    3. 조건이 true를 반환하면 다음 작업을 수행하십시오:

      1. 아무거나 수행행 전작업의 이벤트 유형에 대해 실행되는 트리거.

      2. 대상 테이블에 대한 검사 제약 조건을 호출하여 지정된 작업을 수행합니다.

      3. 아무거나 수행행 이후작업의 이벤트 유형에 대해 실행되는 트리거.

  3. 아무거나 수행다음 진술실제로 발생하는지 여부에 관계없이 지정된 작업을 트리거합니다. 이는의 동작과 유사합니다.업데이트행을 수정하지 않는 문입니다.

요약하면 명령문은 이벤트 유형에 대해 트리거됩니다(예:삽입)는 우리가 언제든지 해고될 것입니다.지정그런 종류의 행동. 이와 대조적으로 행 수준 트리거는 다음과 같은 특정 이벤트 유형에 대해서만 실행됩니다.실행됨. 그래서MERGE명령은 두 가지 모두에 대해 명령문 트리거를 실행할 수 있습니다.업데이트그리고삽입, 단지업데이트행 트리거가 실행되었습니다.

조인이 각 대상 행에 대해 최대 하나의 후보 변경 행을 생성하는지 확인해야 합니다. 즉, 대상 행은 둘 이상의 데이터 소스 행에 조인되어서는 안 됩니다. 그렇다면 후보 변경 행 중 하나만 사용하여 대상 행을 수정합니다. 나중에 행을 수정하려고 하면 오류가 발생합니다. 이는 행 트리거가 대상 테이블을 변경하고 수정된 행이 이후에 다음에 의해 수정되는 경우에도 발생할 수 있습니다.병합. 반복되는 동작이 다음과 같은 경우:삽입, 이로 인해 고유성 위반이 발생하지만 반복됩니다.업데이트또는삭제카디널리티 위반이 발생합니다. 후자의 동작은 다음에서 요구됩니다.SQL표준. 이는 역사적 내용과 다릅니다.PostgreSQL조인 동작업데이트그리고삭제동일한 행을 수정하려는 두 번째 및 후속 시도가 단순히 무시되는 문.

만약에언제절에서 생략됨그리고sub-clause, 해당 종류의 최종 도달 가능한 절이 됩니다. (일치함또는일치하지 않음). 만약 나중에언제해당 종류의 절이 지정되면 도달할 수 없는 것으로 입증되고 오류가 발생합니다. 어떤 종류의 최종 도달 가능 절도 지정되지 않은 경우 후보 변경 행에 대해 아무런 조치도 취하지 않을 수 있습니다.

데이터 소스에서 행이 생성되는 순서는 기본적으로 불확실합니다. 갑source_query필요한 경우 동시 트랜잭션 간의 교착 상태를 방지하는 데 필요할 수 있는 일관된 순서를 지정하는 데 사용할 수 있습니다.

아무것도 없습니다돌아오는 중다음과 함께병합. 의 작업삽입, 업데이트그리고삭제포함할 수 없음돌아오는 중또는위드절.

언제병합은 대상 스포츠 토토 결과을 수정하는 다른 명령과 동시에 실행되며 일반적인 트랜잭션 격리 규칙이 적용됩니다. 참조섹션 13.2각 격리 수준의 동작에 대한 설명입니다. 다음을 사용하는 것도 고려할 수 있습니다.충돌 시 삽입...실행 기능을 제공하는 대체 명령문으로업데이트동시인 경우삽입발생합니다. 두 문 유형 사이에는 다양한 차이점과 제한 사항이 있으며 서로 바꿔 사용할 수 없습니다.

다음에서 유지 관리 수행고객_계정신규 기반최근_거래.

고객_계정 CA로 병합
최근 거래 t 사용
ON t.customer_id = ca.customer_id
일치했을 때
  업데이트 세트 잔액 = 잔액 + 거래_값
일치하지 않을 때
  INSERT(고객_ID, 잔액)
  VALUES(t.customer_id, t.transaction_value);

이것은 다음 문장과 정확히 동일하다는 점에 주목하세요. 왜냐하면일치함실행 중에는 결과가 변경되지 않습니다.

고객_계정 CA로 병합
USING (최근_거래에서 고객_ID, 거래_값 선택) AS t
ON t.customer_id = ca.customer_id
일치했을 때
  업데이트 세트 잔액 = 잔액 + 거래_값
일치하지 않을 때
  INSERT(고객_ID, 잔액)
  VALUES(t.customer_id, t.transaction_value);

재고 수량과 함께 새 재고 항목을 삽입하려고 시도합니다. 항목이 이미 존재하는 경우 대신 기존 항목의 재고 수를 업데이트하십시오. 재고가 전혀 없는 항목은 허용하지 않습니다.

와인으로 병합 w
wine_stock_changes 사용하기
ON s.winename = w.winename
일치하지 않고 s.stock_delta  0인 경우
  값 삽입(s.winename, s.stock_delta)
일치하고 w.stock + s.stock_delta  0인 경우
  업데이트 세트 주식 = w.stock + s.stock_delta
일치했을 때
  삭제;

wine_stock_changes스포츠 토토 결과은 예를 들어 최근에 데이터베이스에 로드된 임시 스포츠 토토 결과일 수 있습니다.

호환성

이 명령은 다음을 준수합니다.SQL표준.

함께절 및아무것도 하지 않음액션은 다음의 확장입니다SQL표준.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.