병합 - 테이블의 행을 조건부 삽입, 업데이트 또는 삭제
[withWith_Query
[, ...]] [only]에 합병target_table_name
[ *] [[as]target_alias
] 사용data_source
onjoin_condition
when_clause
[...] [반환 * |output_expression
[[as]output_name
] [, ...]]여기서data_source
is :[전용]source_table_name
[ *] | (Source_Query
) [[as]source_alias
]andwhen_clause
is :일치 할 때 [및조건
] 그런 다음merge_update
|merge_delete
| 아무것도하지 않습니다 | 소스와 일치하지 않을 때 [and조건
] 그런 다음merge_update
|merge_delete
| 아무것도하지 않습니다 | [target] [and 일치하지 않을 때조건
] 그런 다음merge_insert
| 아무것도하지 않아andmerge_insert
is :삽입 [(column_name
[, ...])] [재정의 시스템 | 사용자 value] 값 (표현
| 기본값 [, ...]) | 기본값andmerge_update
is :업데이트 세트column_name
=표현
| 기본값 | (column_name
[, ...]) = [row] (표현
| 기본값 [, ...]) | (column_name
[, ...]) = (sub-select
) [, ...]andmerge_delete
IS :삭제
병합
|target_table_name
, 사용data_source
. 병합
단일 제공SQL조건부로 할 수있는 진술삽입
, 업데이트
또는삭제
행, 여러 절차 언어 진술이 필요한 작업.
먼저병합
명령에서 join을 수행합니다data_source
0 이상의 후보 변경 행을 생성하는 대상 토토 캔에. 각 후보 변경 행에 대해의 상태매치
, 소스와 일치하지 않음
또는[대상별로] 일치하지 않음
한 번만 설정 한 후when
절정은 지정된 순서로 평가됩니다. 각 후보 변경 행에 대해 TRUE로 평가하는 첫 번째 조항이 실행됩니다. 하나 이상언제
모든 후보 변경 행에 대해 조항이 실행됩니다.
병합
행동은 정기적 인 것과 동일한 영향을 미칩니다업데이트
, 삽입
또는삭제
같은 이름의 명령. 해당 명령의 구문은 다릅니다. 특히여기서
절과 토토 캔 이름이 지정되지 않습니다. 모든 동작은 대상 토토 캔을 참조하지만 다른 토토 캔에 대한 수정은 트리거를 사용하여 이루어질 수 있습니다.
언제아무것도하지 않습니다
지정되어 소스 행이 건너 뜁니다. 행동이 지정된 순서로 평가되므로아무것도하지 않습니다
보다 세밀한 취급을하기 전에 비 관심이없는 소스 행을 건너 뛰는 데 유용 할 수 있습니다.
선택 사항반환
절의 원인병합
삽입, 업데이트 또는 삭제 된 각 행을 기반으로 값을 계산하고 반환합니다. 소스 또는 대상 테이블의 열을 사용한 모든 표현식 또는merge_action ()
함수를 계산할 수 있습니다.삽입
또는업데이트
동작이 수행되면 대상 토토 캔 열의 새 값이 사용됩니다. A삭제
가 수행되면 대상 토토 캔의 기존 값이 사용됩니다. 의 구문반환
목록은 출력 목록의 목록과 동일합니다select
.
별도의 것이 없습니다병합
특권. 업데이트 작업을 지정하면가 있어야합니다.업데이트
|set
절. 삽입 작업을 지정하면가 있어야합니다.삽입
대상 테이블의 권한. 삭제 조치를 지정하면가 있어야합니다.삭제
대상 토토 캔의 권한. A를 지정하는 경우아무것도하지 않습니다
행동, 당신은가 있어야합니다.select
대상 토토 캔의 최소 한 열의 특권. 당신은 또한 필요합니다select
data_source
및 대상 표의조건
(포함join_condition
) 또는표현
. 권한은 명세서 시작시 한 번 테스트되며 특정 여부를 확인합니다언제
조항이 실행됩니다.
병합
대상 테이블이 구체화 된보기, 외국 표, 또는 규칙에 정의 된 규칙이있는 경우 지원되지 않습니다.
With_Query
with
절에서 이름으로 언급 할 수있는 하나 이상의 하위 쿼리를 지정할 수 있습니다병합
쿼리. 보다PostgreSQL : 문서 : 17 : 7.8. 스포츠 토토 사이트와 함께 (공통 테이블 표현식)andselect자세한 내용. 참고재귀
지원되지 않습니다병합
.
target_table_name
대상 테이블의 이름 (선택적으로 스키마 자격) 또는 병합보기. 만약에전용
테이블 이름 앞에 지정되어 있으며, 일치 행이 명명 된 테이블에서만 업데이트되거나 삭제됩니다. 만약에전용
지정되지 않으며, 일치 행은 이름이 지정된 테이블에서 상속되는 테이블에서 업데이트되거나 삭제됩니다. 선택적으로,*
토토 캔 이름 후에 지정하여 자손 토토 캔이 포함되어 있음을 명시 적으로 나타냅니다. 그만큼전용
키워드 및*
옵션 삽입 조치에 영향을 미치지 않으며 항상 이름이 지정된 테이블에만 삽입됩니다.
iftarget_table_name
보기입니다. NO로 자동 업데이트 할 수 있어야합니다대신
트리거, 또는 있어야합니다대신
모든 유형의 동작에 대한 트리거 (삽입
, 업데이트
및삭제
) 지정언제
조항. 규칙이있는 견해는 지원되지 않습니다.
target_alias
대상 토토 캔의 대체 이름. 별칭이 제공되면 토토 캔의 실제 이름을 완전히 숨 깁니다. 예를 들어, 주어진foo로 foo로 f
, 나머지병합
진술은이 토토 캔을로 언급해야합니다.f
notfoo
.
source_table_name
소스 테이블,보기 또는 전환 테이블의 이름 (선택적으로 스키마 자격). 만약에전용
토토 캔 이름 앞에 지정되어 있으며, 일치 행은 명명 된 토토 캔에서만 포함됩니다. 만약에전용
지정되지 않았으며, 일치 행은 이름이 지정된 토토 캔에서 상속되는 토토 캔에서도 포함됩니다. 선택적으로,*
토토 캔 이름 후에 지정하여 자손 토토 캔이 포함되어 있음을 명시 적으로 표시 할 수 있습니다.
Source_Query
query (select
Statement 또는값
statement) 대상 테이블에 병합 될 행을 제공하는 행. 참조select성명서 또는값구문 설명에 대한 명령문.
source_alias
데이터 소스의 대체 이름. 별칭이 제공되면 토토 캔의 실제 이름이나 쿼리가 발행되었다는 사실을 완전히 숨 깁니다.
join_condition
join_condition
유형의 값을 초래하는 표현식입니다부울
(A와 유사여기서
절)에서 어떤 행을 지정하는.data_source
대상 토토 캔의 행을 일치시킵니다.
일치하려는 대상 토토 캔의 열만data_source
행이 나타나야join_condition
. join_condition
대상 테이블의 열만 참조하는 하위 표현은 종종 놀라운 방식으로 어떤 조치를 취할 수 있는지에 영향을 줄 수 있습니다.
둘 다소스와 일치하지 않을 때
and[Target에 의해] 일치하지 않을 때
조항이 지정되어 있습니다.병합
명령은 a를 수행합니다.full
사이에 가입data_source
18574_18630join_condition
Subexpression은 해시 조인을 지원할 수있는 연산자를 사용해야합니다. 그렇지 않으면 모든 하위 표현은 병합 조인을 지원할 수있는 연산자를 사용해야합니다.
when_clause
적어도 하나언제
조항이 필요합니다.
the언제
조항은 지정할 수 있습니다일치 할 때
, 소스와 일치하지 않을 때
또는[target에 의해] 일치하지 않을 때
.SQL표준 전용 정의일치 할 때
and일치하지 않을 때
(일치하는 대상 행을 의미하지 않도록 정의 됨).소스와 일치하지 않을 때
SQL표준, 추가 옵션대상
to일치하지 않을 때
, 그 의미를보다 명확하게 만들려면
언제
조항 지정일치 할 때
그리고 후보 변경 행은에서 행과 일치합니다.data_source
대상 테이블의 행으로,when
조항은이면 실행됩니다조건
결석하거나 평가합니다true
.
언제
조항을 지정합니다소스와 일치하지 않을 때
그리고 후보 변경 행은 대상 테이블의 행을 나타냅니다.data_source
,언제
|조건
결석하거나 평가합니다true
.
인 경우언제
조항 지정[target에 의해] 일치하지 않을 때
그리고 후보 변경 행은의 행을 나타냅니다.data_source
대상 테이블의 행과 일치하지 않습니다.언제
|조건
결석하거나 평가합니다true
.
조건
유형 값을 반환하는 표현식부울
. A에 대한이 표현이 있다면언제
절이 반환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_source
행.
기본값
열을 기본값으로 설정합니다 (NULL
특정 기본 표현식이 할당되지 않은 경우).
Sub-Select
aselect
이전의 괄호 화 된 열 목록에 나열된만큼 많은 출력 열을 생성하는 하위 쿼리. 하위 쿼리는 실행될 때 1 행을 넘어서는 안됩니다. 하나의 행을 생성하면 열 값이 대상 열에 할당됩니다. 행이 없으면 행 값이 대상 열에 할당됩니다. A에서 사용되는 경우일치 할 때
절에서 하위 쿼리는 대상 테이블의 원래 행의 값을 참조 할 수 있으며data_source
행. A에서 사용되는 경우소스와 일치하지 않을 때
절에서 하위 쿼리는 대상 테이블의 원래 행의 값 만 참조 할 수 있습니다.
output_expression
계산 및 반환 할 표현식병합
각 행 변경 후 명령 (삽입, 업데이트 또는 삭제). 표현식은 소스 또는 대상 테이블의 열 또는의 열을 사용할 수 있습니다.merge_action ()
실행 된 조치에 대한 추가 정보를 반환 할 수 있습니다.
쓰기*
소스 테이블에서 모든 열을 반환하고 대상 테이블의 모든 열이 뒤 따릅니다. 소스 및 대상 테이블이 동일한 열을 많이 갖는 것이 일반적이기 때문에 종종 많은 복제로 이어질 것입니다. 이것은 자격을 갖추면 피할 수 있습니다*
소스 또는 대상 테이블의 이름 또는 별칭이 포함되어 있습니다.
output_name
반환 된 열에 사용할 이름.
성공적인 완료시 A병합
명령은 양식의 명령 태그를 반환
병합Total_Count
theTotal_Count
총 행이 변경되었는지 (삽입, 업데이트 또는 삭제하든). 만약에Total_Count
0, 어떤 식 으로든 행이 변경되지 않았습니다.
인 경우병합
명령이 포함되어반환
조항, 결과는 a의 결과와 유사합니다.select
|반환
명령에 의해 삽입, 업데이트 또는 삭제 된 행을 통해 계산 된 목록.
다음 단계는 실행 중에 발생합니다.병합
.
공연이전 명령문
지정된 모든 조치에 대한 트리거언제
Clauses Match.
소스에서 대상 테이블로 조인을 수행합니다. 결과 쿼리는 정상적으로 최적화되며 일련의 후보 변경 행을 생성합니다. 각 후보자 변경 행에 대해
각 행이 있는지 평가합니다일치
, 소스와 일치하지 않음
또는[대상별로 일치하지 않음]
.
각각 테스트언제
하나가 진실을 반환 할 때까지 지정된 순서의 조건.
조건이 true를 반환하면 다음 조치를 수행하십시오.
수행전 행
액션의 이벤트 유형에 대한 발사 트리거.
지정된 조치를 수행하여 대상 테이블에서 확인 제약 조건을 호출합니다.
수행After Row
액션의 이벤트 유형에 대한 발사 트리거.
대상 관계가보기 인 경우대신 행
액션의 이벤트 유형을 트리거하면 대신 작업을 수행하는 데 사용됩니다.
성능이후의 진술
실제로 발생하는지 여부에 관계없이 지정된 조치를 트리거합니다. 이것은 an의 행동과 유사합니다업데이트
행을 수정하는 진술.
요약하면, 이벤트 유형에 대한 명세서 트리거 (wecond,삽입
) 우리가 언제마다 해고 될 것입니다지정그런 종류의 행동. 대조적으로,로드 레벨 트리거는 특정 이벤트 유형에 대해서만 발사됩니다실행. 그래서 A병합
Command Make Command Make Fire 문 트리거 트리거업데이트
and삽입
업데이트
행 트리거가 해고되었습니다.
가입이 각 대상 행에 대해 최대 하나의 후보 변경 행을 생성해야합니다. 다시 말해, 대상 행은 둘 이상의 데이터 소스 행에 결합해서는 안됩니다. 그렇다면 후보 변경 행 중 하나만 사용하여 대상 행을 수정합니다. 나중에 행을 수정하려는 시도는 오류가 발생합니다. 행 트리거가 대상 테이블을 변경하고 그렇게 수정 된 행을이어서 이후에도 수정하면병합
. 반복적 인 행동이 인 경우삽입
, 이로 인해 고유성 위반이 발생하고 반복업데이트
또는삭제
카디널리티 위반을 일으킬 것입니다. 후자의 행동은에 의해 필요합니다.SQL표준. 이것은 역사적으로 다릅니다PostgreSQL조인 동작에서업데이트
and삭제
동일한 행을 수정하려는 두 번째 및 후속 시도가 단순히 무시되는 진술.
a언제
조항은 an을 생략합니다and
하위 클라스, 그것은 그러한 종류의 최종 도달 조항이됩니다 (일치
, 소스와 일치하지 않음
또는[대상별로] 일치하지 않음
). 나중에언제
그러한 종류의 조항은 지정되어있을 수 없으며 오류가 발생합니다. 최종 도달 조항이 어느 한 종류로 지정되지 않으면 후보 변경 행에 대한 조치를 취하지 않을 수 있습니다.
데이터 소스에서 행이 생성되는 순서는 기본적으로 불확실합니다. 에이Source_Query
필요한 경우 일관된 순서를 지정하는 데 사용될 수 있습니다. 이는 동시 거래 사이의 교착 상태를 피하기 위해 필요할 수 있습니다.
언제병합
대상 테이블을 수정하는 다른 명령과 동시에 실행되면 일반적인 트랜잭션 격리 규칙이 적용됩니다. 보다섹션 13.2각 격리 수준에서 동작에 대한 설명. 사용을 고려하고 싶을 수도 있습니다.삽입 ... 충돌
실행 능력을 제공하는 대체 진술로서업데이트
동시에삽입
발생합니다. 두 문장 유형 사이에는 다양한 차이점과 제한이 있으며 교환 할 수 없습니다.
유지 보수 수행customer_accounts
신규 기반최근_transactions
.
Customer_Account Ca로 병합 최근_transactions 사용 t t.customer_id = ca.customer_id에서 그때 일치 할 때 밸런스 세트를 업데이트하십시오 = 밸런스 + 트랜잭션_Value 그때 일치하지 않을 때 삽입 (customer_id, 밸런스) 값 (t.customer_id, t.transaction_value);
이것은 다음 진술과 정확히 동일하다는 것을 알 수 있습니다.일치
실행 중에 결과가 변경되지 않습니다.
Customer_Account CA에 합병하십시오 사용 (customer_id를 select, transaction_value에서 최근 _transactions에서 t t.customer_id = ca.customer_id에서 그때 일치 할 때 밸런스 세트를 업데이트하십시오 = 밸런스 + 트랜잭션_Value 그때 일치하지 않을 때 삽입 (customer_id, 밸런스) 값 (t.customer_id, t.transaction_value);
재고량과 함께 새 재고 품목을 삽입하려고 시도합니다. 항목이 이미 존재하는 경우 대신 기존 품목의 재고 수를 업데이트하십시오. 재고가없는 항목을 허용하지 마십시오. 모든 변경 사항에 대한 세부 정보를 반환합니다.
와인으로 합병 w Wine_stock_changes 사용 s 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.*;
theWine_stock_changes
예를 들어 최근 데이터베이스에로드 된 임시 토토 캔이 될 수 있습니다.
업데이트와인
교체 와인리스트를 기준으로 새로운 주식에 대한 행을 삽입하고, 수정 된 재고 항목을 업데이트하고, 새 목록에없는 와인을 삭제합니다.
와인으로 합병 w new_wine_list 사용 s s.winename = w.winename에서 대상과 일치하지 않을 때 값 삽입 (s.wineName, s.stock) 일치하고 W.stock! = s.stock으로 업데이트 세트 스톡 = S.Stock 소스와 일치하지 않을 때 삭제;
이 명령은에 부합합니다.SQL표준.
thewith
절,by Source
and대상
예선일치하지 않을 때
, 아무것도하지 않습니다
ACTION 및반환
조항은에 대한 확장입니다.SQL표준.
올바른 문서에 아무것도 표시되면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면