MERGE — 조건부로 토토 사이트 행 삽입, 업데이트 또는 삭제
[ 와with_query[, ...] ] [만]으로 병합target_table_name[ * ] [ [ AS ]target_alias] 사용data_source켜짐join_conditionwhen_clause[...] [ 복귀 중 * |출력_표현[ [ 그대로 ]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()함수를 계산할 수 있습니다. 언제삽입또는업데이트작업이 수행되면 대상 토토 사이트 열의 새 값이 사용됩니다. 때삭제이 수행되면 대상 테이블 열의 이전 값이 사용됩니다. 의 구문돌아오는 중목록은 출력 목록의 목록과 동일합니다.선택.
별도는 없습니다병합특권. 업데이트 작업을 지정하는 경우 다음이 있어야 합니다.업데이트에서 참조되는 대상 토토 사이트의 열에 대한 권한SET절. 삽입 작업을 지정하는 경우 다음이 있어야 합니다.삽입대상 테이블에 대한 권한. 삭제 작업을 지정하는 경우 다음이 있어야 합니다.삭제대상 토토 사이트에 대한 권한. a를 지정하는 경우아무것도 하지 않음작업을 수행하려면 다음이 있어야 합니다.선택대상 토토 사이트의 하나 이상의 열에 대한 권한. 당신은 또한 필요합니다선택의 모든 열에 대한 권한data_source및 임의의 대상 토토 사이트에 대해조건(포함join_condition) 또는표현. 권한은 명령문 시작 시 한 번 테스트되며 특별한지 여부를 확인합니다.언제절이 실행됩니다.
병합대상 테이블이 구체화된 뷰, 외부 테이블이거나 정의된 규칙이 있는 경우 지원되지 않습니다.
with_query그위드절을 사용하면에서 이름으로 참조할 수 있는 하나 이상의 하위 쿼리를 지정할 수 있습니다.병합질의. 참조PostgreSQL : 문서 : 17 : 7.8. 스포츠 토토 사이트와 함께 (공통 테이블 표현식)그리고선택13850_13876재귀적 사용다음에서는 지원되지 않습니다.병합.
target_table_name병합할 대상 테이블 또는 뷰의 이름(선택적으로 스키마 한정). 만일만이 테이블 이름 앞에 지정되면 일치하는 행은 명명된 테이블에서만 업데이트되거나 삭제됩니다. 만일만이 지정되지 않으면 명명된 테이블에서 상속되는 모든 테이블에서 일치하는 행도 업데이트되거나 삭제됩니다. 선택적으로,*토토 사이트 이름 뒤에 지정하여 하위 토토 사이트이 포함되어 있음을 명시적으로 나타낼 수 있습니다.만키워드 및*옵션은 항상 명명된 테이블에만 삽입하는 삽입 작업에 영향을 주지 않습니다.
만약target_table_name뷰이므로 자동으로 업데이트할 수 있어야 합니다.대신트리거이거나 반드시 있어야 합니다대신모든 유형의 작업에 대한 트리거(삽입, 업데이트및삭제)가에 지정됨언제절. 규칙이 있는 보기는 지원되지 않습니다.
target_alias대상 토토 사이트의 대체 이름입니다. 별칭이 제공되면 토토 사이트의 실제 이름이 완전히 숨겨집니다. 예를 들어, 주어진Foo AS f로 병합, 나머지병합문은 이 테이블을 다음과 같이 참조해야 합니다.f아님foo.
source_table_name소스 테이블, 뷰 또는 전환 테이블의 이름(선택적으로 스키마 한정). 만일만이 토토 사이트 이름 앞에 지정되어 있으며, 일치하는 행은 명명된 토토 사이트에서만 포함됩니다. 만일만이 지정되지 않으면 명명된 테이블에서 상속되는 모든 테이블에서도 일치하는 행이 포함됩니다. 선택적으로,*토토 사이트 이름 뒤에 지정하여 하위 토토 사이트이 포함되어 있음을 명시적으로 나타낼 수 있습니다.
source_query쿼리(선택성명 또는값문)은 대상 테이블에 병합할 행을 제공합니다. 참조선택성명 또는값구문 설명에 대한 설명입니다.
source_alias데이터 소스의 대체 이름입니다. 별칭을 제공하면 토토 사이트의 실제 이름이나 쿼리가 실행되었다는 사실이 완전히 숨겨집니다.
join_conditionjoin_condition유형 값을 생성하는 표현식입니다.부울(a와 유사어디절)은의 행을 지정합니다.data_source대상 토토 사이트의 행과 일치합니다.
일치하려는 대상 토토 사이트의 열만data_source행은 다음에 나타나야 합니다.join_condition. join_condition대상 테이블의 열만 참조하는 하위 표현식은 종종 놀라운 방식으로 수행되는 작업에 영향을 미칠 수 있습니다.
둘 다인 경우소스와 일치하지 않는 경우그리고[대상별] 일치하지 않는 경우절이 지정되었습니다.병합명령은 다음을 수행합니다전체사이에 가입data_source및 대상 토토 사이트. 이것이 작동하려면 적어도 하나join_condition하위 표현식은 해시 조인을 지원할 수 있는 연산자를 사용해야 합니다. 그렇지 않으면 모든 하위 표현식이 병합 조인을 지원할 수 있는 연산자를 사용해야 합니다.
when_clause적어도 하나언제절이 필요합니다.
그언제절에서 지정할 수 있음일치하는 경우, 소스와 일치하지 않는 경우, 또는[대상별] 일치하지 않는 경우. 참고하세요SQL표준은 정의만 함일치하는 경우그리고일치하지 않는 경우(일치하는 대상 행이 없음을 의미하도록 정의됨).소스와 일치하지 않는 경우다음의 확장입니다.SQL표준, 추가 옵션도 마찬가지임대상별에일치하지 않는 경우, 의미를 더욱 명확하게 하기 위해.
만약에언제절이 지정함일치하는 경우그리고 후보 변경 행은 다음의 행과 일치합니다.data_source대상 토토 사이트의 행에언제다음과 같은 경우 절이 실행됩니다.조건부재 또는 다음으로 평가됨사실.
만약에언제절이 지정함소스와 일치하지 않는 경우그리고 후보 변경 행은 대상 테이블의 행과 일치하지 않는 대상 테이블의 행을 나타냅니다.data_source, 그언제다음과 같은 경우 절이 실행됩니다.조건부재하거나 다음으로 평가됨참.
만약에언제절이 지정함[대상별] 일치하지 않는 경우그리고 후보 변경 행은 다음의 행을 나타냅니다.data_source대상 토토 사이트의 행과 일치하지 않습니다.언제절은 다음과 같은 경우에 실행됩니다.조건부재하거나 다음으로 평가됨참.
조건유형의 값을 반환하는 표현식부울. 이 표현식이 a언제절 반환참, 그러면 해당 절에 대한 작업이 해당 행에 대해 실행됩니다.
a의 조건일치하는 경우절은 소스 관계와 대상 관계 모두의 열을 참조할 수 있습니다. a에 대한 조건소스와 일치하지 않는 경우절은 정의에 따라 일치하는 소스 행이 없기 때문에 대상 관계의 열만 참조할 수 있습니다. a에 대한 조건[대상별] 일치하지 않는 경우절은 정의에 따라 일치하는 대상 행이 없기 때문에 소스 관계의 열만 참조할 수 있습니다. 대상 토토 사이트의 시스템 속성에만 액세스할 수 있습니다.
merge_insertan의 사양삽입대상 테이블에 행 하나를 삽입하는 작업입니다. 대상 열 이름은 순서에 관계없이 나열될 수 있습니다. 열 이름 목록이 전혀 제공되지 않으면 기본값은 선언된 순서대로 테이블의 모든 열입니다.
명시적 또는 암시적 열 목록에 없는 각 열은 기본값으로 채워집니다. 선언된 기본값 또는 기본값이 없는 경우 null입니다.
대상 테이블이 분할된 테이블인 경우 각 행은 적절한 파티션으로 라우팅되어 여기에 삽입됩니다. 대상 테이블이 파티션인 경우 입력 행이 파티션 제약 조건을 위반하면 오류가 발생합니다.
열 이름은 두 번 이상 지정할 수 없습니다.삽입작업에는 하위 선택이 포함될 수 없습니다.
단 하나값절을 지정할 수 있습니다.값절은 정의에 따라 일치하는 대상 행이 없기 때문에 소스 관계의 열만 참조할 수 있습니다.
merge_updatean의 사양업데이트대상 테이블의 현재 행을 업데이트하는 작업입니다. 열 이름은 두 번 이상 지정할 수 없습니다.
토토 사이트 이름도 아니고 a도 아닙니다어디절이 허용됩니다.
merge_deletea를 지정합니다삭제대상 테이블의 현재 행을 삭제하는 작업입니다. 일반적으로 a를 사용하는 것처럼 테이블 이름이나 다른 절을 포함하지 마십시오.삭제명령.
컬럼_이름대상 테이블의 열 이름. 필요한 경우 하위 필드 이름이나 배열 첨자로 열 이름을 한정할 수 있습니다. (복합 컬럼의 일부 필드에만 삽입하면 나머지 필드는 null이 됩니다.) 대상 컬럼 지정에 테이블 이름을 포함하지 마십시오.
시스템 값 재정의이 절 없이 명시적인 값을 지정하는 것은 오류입니다(기본값) 다음과 같이 정의된 ID 열의 경우항상 생성됨. 이 조항은 해당 제한을 무시합니다.
사용자 값 무시이 절이 지정되면 다음과 같이 정의된 ID 열에 제공된 모든 값기본값으로 생성됨무시되고 기본 시퀀스 생성 값이 적용됩니다.
기본값모든 열은 기본값으로 채워질 것입니다. (안재정의 중절은 이 양식에서 허용되지 않습니다.)
표현열에 할당할 표현식입니다. a에서 사용되는 경우일치하는 경우절, 표현식은 대상 테이블의 원래 행 값과data_source행. a에서 사용되는 경우소스와 일치하지 않는 경우절, 표현식은 대상 테이블에 있는 원래 행의 값만 사용할 수 있습니다. a에서 사용되는 경우[대상별] 일치하지 않는 경우절, 표현식은의 값만 사용할 수 있습니다.data_source행.
기본값열을 기본값으로 설정합니다(이것은NULL특정 기본 표현식이 할당되지 않은 경우).
하위 SELECTA 선택앞의 괄호로 묶인 열 목록에 나열된 만큼의 출력 열을 생성하는 하위 쿼리입니다. 하위 쿼리는 실행 시 행을 1개 이상 생성해서는 안 됩니다. 하나의 행이 생성되면 해당 열 값이 대상 열에 할당됩니다. 행이 생성되지 않으면 대상 열에 NULL 값이 할당됩니다. a에서 사용되는 경우일치하는 경우절, 하위 쿼리는 대상 토토 사이트의 원래 행 값과data_source행. a에서 사용되는 경우소스와 일치하지 않는 경우절, 하위 쿼리는 대상 토토 사이트의 원래 행 값만 참조할 수 있습니다.
출력_표현다음에 의해 계산되고 반환되는 표현식병합27648_27800merge_action()실행된 작업에 대한 추가 정보를 반환하는 함수입니다.
쓰기*원본 테이블의 모든 열을 반환하고 그 뒤에 대상 테이블의 모든 열을 반환합니다. 원본 테이블과 대상 테이블에 동일한 열이 많이 있는 것이 일반적이므로 이로 인해 많은 중복이 발생하는 경우가 많습니다. 이는 다음을 검증하여 피할 수 있습니다.*소스 또는 대상 테이블의 이름이나 별칭으로.
output_name반환된 열에 사용할 이름입니다.
성공적으로 완료되면, a병합명령은 다음 형식의 명령 태그를 반환합니다.
병합total_count
그total_count은 변경된(삽입, 업데이트 또는 삭제 여부에 관계없이) 총 행 수입니다. 만일total_count은 0이며 어떤 행도 변경되지 않았습니다.
만약에병합명령에 다음이 포함됨돌아오는 중절, 결과는 a의 결과와 유사합니다.선택에 정의된 열과 값을 포함하는 문돌아오는 중명령으로 삽입, 업데이트 또는 삭제된 행에 대해 계산된 목록입니다.
다음 단계는 실행 중에 발생합니다.병합.
아무거나 수행진술 전지정된 모든 작업에 대한 트리거언제절이 일치합니다.
소스에서 대상 토토 사이트로 조인을 수행합니다. 결과 쿼리는 정상적으로 최적화되고 후보 변경 행 집합을 생성합니다. 각 후보 변경 행에 대해,
각 행이 다음과 같은지 평가합니다.일치함, 소스와 일치하지 않음또는[대상별] 일치하지 않음.
각 테스트언제참을 반환할 때까지 지정된 순서대로 조건을 지정합니다.
조건이 true를 반환하면 다음 작업을 수행하십시오:
아무거나 수행행 전작업의 이벤트 유형에 대해 실행되는 트리거.
대상 테이블에 대한 검사 제약 조건을 호출하여 지정된 작업을 수행합니다.
아무거나 수행행 이후작업의 이벤트 유형에 대해 실행되는 트리거.
대상 관계가 다음을 포함하는 뷰인 경우행 대신작업의 이벤트 유형에 대한 트리거이며 대신 작업을 수행하는 데 사용됩니다.
아무거나 수행명령문 이후실제로 발생하는지 여부에 관계없이 지정된 작업을 트리거합니다. 이는의 동작과 유사합니다.업데이트행을 수정하지 않는 문입니다.
요약하자면, 명령문은 이벤트 유형에 대해 트리거됩니다(예:삽입)는 우리가 언제든지 해고될 것입니다.지정그런 종류의 행동이요. 이와 대조적으로 행 수준 트리거는 다음과 같은 특정 이벤트 유형에 대해서만 실행됩니다.실행됨. 그래서병합명령은 두 가지 모두에 대해 명령문 트리거를 실행할 수 있습니다.업데이트그리고삽입, 비록업데이트행 트리거가 실행되었습니다.
조인이 각 대상 행에 대해 최대 하나의 후보 변경 행을 생성하는지 확인해야 합니다. 즉, 대상 행은 둘 이상의 데이터 소스 행에 조인되어서는 안 됩니다. 그렇다면 후보 변경 행 중 하나만 사용하여 대상 행을 수정합니다. 나중에 행을 수정하려고 하면 오류가 발생합니다. 이는 행 트리거가 대상 테이블을 변경하고 수정된 행이 이후에 다음에 의해 수정되는 경우에도 발생할 수 있습니다.병합. 반복되는 동작이 다음과 같은 경우:삽입, 이로 인해 고유성 위반이 발생하지만 반복됩니다.업데이트또는삭제카디널리티 위반이 발생합니다. 후자의 동작은 다음에서 요구됩니다.SQL표준. 이는 역사적 내용과 다릅니다.포스트그레SQL조인 동작업데이트그리고삭제동일한 행을 수정하려는 두 번째 및 후속 시도가 단순히 무시되는 문.
만약에언제절에서 생략됨그리고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 일치했을 때 삭제 반환 merge_action(), w.*;
그wine_stock_changes토토 사이트은 예를 들어 최근에 데이터베이스에 로드된 임시 토토 사이트일 수 있습니다.
업데이트와인대체 와인 목록을 기반으로 새 재고에 대한 행 삽입, 수정된 재고 항목 업데이트 및 새 목록에 없는 와인 삭제.
와인으로 병합 w new_wine_list 사용하기 ON s.winename = w.winename 대상과 일치하지 않는 경우 값 삽입(s.winename, s.stock) 일치하고 w.stock != s.stock인 경우 업데이트 설정 주식 = s.stock 소스와 일치하지 않는 경우 삭제;
이 명령은 다음을 준수합니다.SQL표준.
그함께절,소스별그리고목표별한정자일치하지 않는 경우, 아무것도 하지 않음동작 및돌아오는 중절은의 확장입니다.SQL표준.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.