병합

MERGE — 조건부로 토토 커뮤니티 행 삽입, 업데이트 또는 삭제

시놉시스

[ 와with_query[, ...] ]
[만]으로 병합target_table_name[ * ] [ [ AS ]target_alias]
    사용data_source켜짐join_condition
    when_clause[...]
    [ 반환 중 [ WITH (  이전 | 새  ASoutput_alias [, ...] ) ]
                { * | 출력_표현[ [ 그대로 ]output_name ] } [, ...] ]

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

그리고when_clause다음은:일치하는 경우 [ AND조건] 그런 다음merge_update | merge_delete| 아무것도 하지 마세요  |
      소스와 일치하지 않는 경우 [ 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개 이하언제후보 변경 행에 대해 절이 실행됩니다.

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

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

선택사항돌아오는 중절 원인병합삽입, 업데이트 또는 삭제된 각 행을 기반으로 값을 계산하고 반환합니다. 소스 또는 대상 테이블의 열을 사용하는 표현식 또는merge_action()함수를 계산할 수 있습니다. 기본적으로 다음과 같은 경우에는삽입또는업데이트작업이 수행되고 대상 토토 커뮤니티 열의 새 값이 사용되며 a삭제이 수행되면 대상 테이블 컬럼의 이전 값이 사용되지만 이전 값과 새 값을 명시적으로 요청할 수도 있습니다. 의 구문돌아오는 중목록은 출력 목록의 목록과 동일합니다.선택.

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

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

매개변수

with_query

위드절을 사용하면에서 이름으로 참조할 수 있는 하나 이상의 하위 쿼리를 지정할 수 있습니다.병합질의. 참조PostgreSQL : 문서 : 18 : 7.8. 메이저 토토 사이트와 함께 (공통 테이블 표현식)그리고선택14070_14096재귀적 사용지원되지 않음병합.

target_table_name

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

만약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대상 테이블의 열만 참조하는 하위 표현식은 종종 놀라운 방식으로 수행되는 작업에 영향을 미칠 수 있습니다.

둘 다인 경우소스와 일치하지 않는 경우그리고[대상별] 일치하지 않는 경우절이 지정되었습니다.병합명령은 다음을 수행합니다전체사이에 가입data_source및 대상 토토 커뮤니티. 이것이 작동하려면 적어도 하나join_condition하위 표현식은 해시 조인을 지원할 수 있는 연산자를 사용해야 합니다. 그렇지 않으면 모든 하위 표현식이 병합 조인을 지원할 수 있는 연산자를 사용해야 합니다.

when_clause

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

언제절이 지정할 수 있음일치하는 경우, 소스와 일치하지 않는 경우, 또는[대상별] 일치하지 않는 경우. 참고하세요SQL표준만 정의함일치하는 경우그리고일치하지 않는 경우(일치하는 대상 행이 없음을 의미하도록 정의됨).소스와 일치하지 않는 경우다음의 확장입니다.SQL표준, 추가 옵션도 마찬가지임목표별일치하지 않는 경우, 의미를 더욱 명확하게 하기 위해.

만약에언제절이 지정함일치하는 경우그리고 후보 변경 행은 다음의 행과 일치합니다.데이터_소스대상 토토 커뮤니티의 행에언제다음과 같은 경우 절이 실행됩니다.조건부재하거나 다음으로 평가됨사실.

만약에언제절이 지정함소스와 일치하지 않는 경우그리고 후보 변경 행은 대상 테이블의 행과 일치하지 않는 대상 테이블의 행을 나타냅니다.data_source, 그언제다음과 같은 경우 절이 실행됩니다.조건없거나 다음과 같이 평가됨.

만약에언제절이 지정함[대상별] 일치하지 않는 경우그리고 후보 변경 행은 다음의 행을 나타냅니다.data_source대상 토토 커뮤니티의 행과 일치하지 않습니다.언제다음과 같은 경우 절이 실행됩니다.조건없거나 다음과 같이 평가됨.

조건

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

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

merge_insert

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

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

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

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

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

merge_update

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

토토 커뮤니티 이름도 아니고 a도 아닙니다어디절이 허용됩니다.

merge_delete

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

열_이름

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

시스템 값 재정의

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

사용자 값 무시

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

기본값

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

표현

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

기본값

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

하위 SELECT

A 선택앞의 괄호로 묶인 열 목록에 나열된 만큼의 출력 열을 생성하는 하위 쿼리입니다. 하위 쿼리는 실행 시 행을 1개 이상 생성해서는 안 됩니다. 하나의 행이 생성되면 해당 열 값이 대상 열에 할당됩니다. 행이 생성되지 않으면 대상 열에 NULL 값이 할당됩니다. a에서 사용되는 경우일치하는 경우절, 하위 쿼리는 대상 토토 커뮤니티의 원래 행 값과data_source행. a에서 사용되는 경우소스와 일치하지 않는 경우절, 하위 쿼리는 대상 토토 커뮤니티의 원래 행 값만 참조할 수 있습니다.

output_alias

다음에 대한 선택적 대체 이름오래된또는신규돌아오는 중목록.

기본적으로 대상 테이블의 이전 값은 쓰기를 통해 반환될 수 있습니다.오래된.열_이름또는오래됨.*, 다음과 같이 쓰면 새 값이 반환될 수 있습니다.새로운.열_이름또는신규.*. 별칭이 제공되면 이러한 이름은 숨겨지며 별칭을 사용하여 이전 행이나 새 행을 참조해야 합니다. 예를 들어(이전 AS o, 신규 AS n) o.*, n.*로 반환.

출력_표현

다음에 의해 계산되고 반환되는 표현식병합28749_28901merge_action()실행된 작업에 대한 추가 정보를 반환하는 함수입니다.

쓰기*원본 테이블의 모든 열을 반환하고 그 뒤에 대상 테이블의 모든 열을 반환합니다. 원본 테이블과 대상 테이블에 동일한 열이 많이 있는 것이 일반적이므로 이로 인해 많은 중복이 발생하는 경우가 많습니다. 이는 다음을 검증하여 피할 수 있습니다.*소스 또는 대상 테이블의 이름이나 별칭으로.

열 이름 또는*또한 다음을 사용하여 한정될 수 있습니다.오래된또는신규또는 해당output_aliasfor오래된또는신규, 대상 테이블의 이전 값이나 새 값이 반환되도록 합니다. 대상 테이블의 정규화되지 않은 열 이름 또는 열 이름 또는*대상 테이블 이름 또는 별칭을 사용하여 한정되면 다음에 대한 새 값을 반환합니다.삽입그리고업데이트작업 및 이전 값삭제작업.

output_name

반환된 열에 사용할 이름입니다.

출력

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

병합total_count

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

만약에병합명령에 다음이 포함됨돌아오는 중절, 결과는 a선택에 정의된 열과 값을 포함하는 문돌아오는 중명령으로 삽입, 업데이트 또는 삭제된 행에 대해 계산된 목록입니다.

참고

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

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

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

    1. 각 행이 다음과 같은지 평가일치함, 소스와 일치하지 않음또는[대상별] 일치하지 않음.

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

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

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

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

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

      대상 관계가 다음을 포함하는 뷰인 경우행 대신작업의 이벤트 유형에 대한 트리거이며 대신 작업을 수행하는 데 사용됩니다.

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

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

조인이 각 대상 행에 대해 최대 하나의 후보 변경 행을 생성하는지 확인해야 합니다. 즉, 대상 행은 둘 이상의 데이터 소스 행에 조인되어서는 안 됩니다. 그렇다면 후보 변경 행 중 하나만 사용하여 대상 행을 수정합니다. 나중에 행을 수정하려고 하면 오류가 발생합니다. 이는 행 트리거가 대상 테이블을 변경하고 수정된 행이 이후에 다음에 의해 수정되는 경우에도 발생할 수 있습니다.병합. 반복되는 동작이 다음과 같은 경우:삽입, 이로 인해 고유성 위반이 발생하지만 반복됩니다.업데이트또는삭제카디널리티 위반이 발생합니다. 후자의 동작은 다음에서 요구됩니다.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);

재고 수량과 함께 새 재고 항목을 삽입하려고 시도합니다. 항목이 이미 존재하는 경우 대신 기존 항목의 재고 수를 업데이트하십시오. 재고가 전혀 없는 항목은 허용하지 마세요. 모든 변경사항에 대한 세부정보를 반환합니다.

와인으로 병합 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
일치했을 때
  삭제
반환 merge_action(), w.winename, old.stock AS old_stock, new.stock AS new_stock;

wine_stock_changes토토 커뮤니티은 예를 들어 최근에 데이터베이스에 로드된 임시 토토 커뮤니티일 수 있습니다.

업데이트와인대체 와인 목록을 기반으로 새 재고에 대한 행 삽입, 수정된 재고 항목 업데이트 및 새 목록에 없는 와인 삭제.

와인으로 병합 w
new_wine_list 사용하기
ON s.winename = w.winename
대상과 일치하지 않는 경우
  값 삽입(s.winename, s.stock)
일치하고 w.stock != s.stock인 경우
  업데이트 설정 주식 = s.stock
소스와 일치하지 않는 경우
  삭제;

호환성

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

함께절,소스별그리고목표별한정자일치하지 않는 경우, 아무것도 하지 않음동작 및돌아오는 중절은 다음의 확장입니다.SQL표준.

수정사항 제출

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