병합 - 테이블의 행을 조건부 삽입, 업데이트 또는 삭제
[withWith_Query
[, ...]] [only]에 합병target_table_name
[ *] [[as]target_alias
] 사용data_source
onjoin_condition
when_clause
[...]여기서data_source
is :[전용]source_table_name
[ *] | (Source_Query
) [[AS]source_alias
]andwhen_clause
IS :일치 할 때 [및조건
] 그런 다음merge_update
|merge_delete
| 아무것도하지 않습니다 | 일치하지 않을 때 [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 이상의 후보 변경 행을 생성하는 대상 스포츠 토토 결과에. 각 후보 변경 행에 대해의 상태일치
또는일치하지 않음
94PostgreSQL : 문서 : 16 : Merge76when
클로스는 지정된 순서대로 평가됩니다. 각 후보 변경 행에 대해 TRUE로 평가하는 첫 번째 조항이 실행됩니다. 하나 이상언제
조항은 후보 변경 행에 대해 실행됩니다.
병합
행동은 일반과 동일한 효과업데이트
, 삽입
또는삭제
같은 이름의 명령. 해당 명령의 구문은 다릅니다. 특히여기서
절과 스포츠 토토 결과 이름이 지정되지 않습니다. 모든 동작은 대상 스포츠 토토 결과을 참조하지만 다른 스포츠 토토 결과에 대한 수정은 트리거를 사용하여 이루어질 수 있습니다.
언제아무것도하지 않습니다
지정되어 소스 행이 건너 뜁니다. 행동이 지정된 순서로 평가되므로아무것도하지 않습니다
보다 세밀한 취급을하기 전에 비 관심있는 소스 행을 건너 뛰는 데 유용 할 수 있습니다.
별도의 것이 없습니다병합
특권. 업데이트 작업을 지정하면가 있어야합니다.업데이트
|set
절. 삽입 작업을 지정하면가 있어야합니다.삽입
대상 테이블의 권한. 삭제 조치를 지정하면가 있어야합니다.삭제
대상 스포츠 토토 결과의 권한. A를 지정하는 경우아무것도하지 않습니다
행동, 당신은가 있어야합니다.select
대상 스포츠 토토 결과의 최소 한 열에있는 권한. 당신은 또한 필요합니다select
data_source
및 대상 표의조건
(포함join_condition
) 또는표현
. 권한은 명세서 시작시 한 번 테스트되며 특정 여부를 확인합니다언제
조항이 실행됩니다.
병합
대상 스포츠 토토 결과이 구체화 된보기, 외국 스포츠 토토 결과이거나 규칙이 정의 된 경우이면 지원되지 않습니다.
With_Query
thewith
절에서 이름으로 언급 할 수있는 하나 이상의 하위 쿼리를 지정할 수 있습니다병합
쿼리. 보다섹션 7.8andselect자세한 내용. 참고재귀
에 의해 지원되지 않습니다병합
.
target_table_name
병합 할 대상 테이블의 이름 (선택적으로 스키마 자격). 만약에전용
테이블 이름 앞에 지정되어 있으며, 일치 행이 명명 된 테이블에서만 업데이트되거나 삭제됩니다. 만약에전용
지정되지 않으며, 일치 행은 지정된 테이블에서 상속되는 테이블에서 업데이트되거나 삭제됩니다. 선택적으로,*
스포츠 토토 결과 이름 후에 지정하여 자손 스포츠 토토 결과이 포함되어 있음을 명시 적으로 표시 할 수 있습니다. 그만큼전용
키워드 및*
옵션 삽입 동작에 영향을 미치지 않으며 항상 이름이 지정된 테이블에만 삽입됩니다.
target_alias
대상 스포츠 토토 결과의 대체 이름. 별칭이 제공되면 스포츠 토토 결과의 실제 이름을 완전히 숨 깁니다. 예를 들어, 주어진foo로 foo로 f
, 나머지병합
진술은이 표를로 언급해야합니다.F
notfoo
.
source_table_name
소스 테이블,보기 또는 전환 테이블의 이름 (선택적으로 스키마 자격). 만약에전용
테이블 이름 앞에 지정되어 있으며, 일치 행은 명명 된 테이블에서만 포함됩니다. 만약에전용
지정되지 않았으며, 일치 행은 이름이 지정된 테이블에서 상속되는 테이블에서도 포함됩니다. 선택적으로,*
스포츠 토토 결과 이름 후에 지정하여 자손 스포츠 토토 결과이 포함되어 있음을 명시 적으로 표시 할 수 있습니다.
Source_Query
query (select
Statement 또는값
Statement) 대상 테이블에 병합 될 행을 제공하는 행. 참조selectStatement 또는값구문 설명에 대한 명령문.
source_alias
데이터 소스의 대체 이름. 별칭이 제공되면 스포츠 토토 결과의 실제 이름이나 쿼리가 발행되었다는 사실을 완전히 숨 깁니다.
join_condition
join_condition
유형의 값을 초래하는 표현식입니다부울
(A와 유사여기서
절)에서 어떤 행을 지정하는.data_source
대상 테이블의 행을 일치시킵니다.
일치하려는 대상 테이블의 열만data_source
행이 나타나야join_condition
. join_condition
대상 테이블의 열만 참조하는 하위 표현은 종종 놀라운 방식으로 어떤 조치를 취할 수 있는지에 영향을 줄 수 있습니다.
when_clause
적어도 하나언제
조항이 필요합니다.
when
조항을 지정합니다일치 할 때
그리고 후보 변경 행은 대상 테이블의 행과 일치합니다.언제
조항이 실행되면조건
결석하거나 평가합니다True
.
반대로,언제
조항을 지정합니다일치하지 않을 때
그리고 후보 변경 행은 대상 테이블의 행과 일치하지 않습니다.언제
|조건
결석 중이거나 평가합니다true
.
조건
유형 값을 반환하는 표현식부울
. A에 대한이 표현이 있다면언제
절이 반환true
, 그러면 해당 조항에 대한 조치가 해당 행에 대해 실행됩니다.
a일치 할 때
절은 소스와 대상 관계의 열을 참조 할 수 있습니다. A의 상태일치하지 않을 때
절은 정의에 따라 일치하는 대상 행이 없기 때문에 소스 관계의 열만 참조 할 수 있습니다. 대상 테이블의 시스템 속성 만 액세스 할 수 있습니다.
merge_insert
an의 사양삽입
한 행을 대상 테이블에 삽입하는 동작. 대상 열 이름은 어떤 순서로든 나열 될 수 있습니다. 열 이름 목록이 전혀없는 경우, 기본값은 선언 된 순서로 테이블의 모든 열입니다.
명시 적 또는 암시 적 열 목록에 존재하지 않는 각 열에는 기본값이 채워집니다.
대상 테이블이 분할 된 테이블 인 경우 각 행은 적절한 파티션으로 라우팅되어 삽입됩니다. 대상 테이블이 파티션 인 경우 입력 행이 파티션 제약 조건을 위반하면 오류가 발생합니다.
열 이름이 두 번 이상 지정되지 않을 수 있습니다.삽입
동작은 하위 선택을 포함 할 수 없습니다.
하나만값
절을 지정할 수 있습니다. 그만큼값
조항은 정의에 따라 대상 행이 일치하지 않기 때문에 소스 관계의 열만 참조 할 수 있습니다.
merge_update
AN의 사양업데이트
대상 테이블의 현재 행을 업데이트하는 조치. 열 이름은 두 번 이상 지정되지 않을 수 있습니다.
스포츠 토토 결과 이름이나 A여기서
조항이 허용됩니다.
merge_delete
a 지정삭제
대상 테이블의 현재 행을 삭제하는 동작. 일반적으로 A와 같이 테이블 이름이나 다른 조항을 포함하지 마십시오.삭제명령.
column_name
대상 테이블의 열 이름. 열 이름은 필요한 경우 하위 필드 이름 또는 배열 첨자로 자격을 갖추 수 있습니다. (복합 열의 일부 필드에만 삽입하면 다른 필드가 널을 남기지 않습니다.) 대상 열 사양에 테이블 이름을 포함하지 마십시오..
시스템 값을 지키는
이 조항이 없으면 명시 적 값을 지정하는 것은 오류입니다 (기본값
) 정의 된 신원 열에 대한항상 생성
. 이 조항은 해당 제한을 무시합니다.
사용자 값 상환
이 조항이 지정된 경우 정의 된 신분 열에 제공되는 값기본적으로 생성
무시되고 기본 시퀀스 생성 값이 적용됩니다.
기본값
모든 열에는 기본값으로 채워집니다. (an재정의
조항은이 양식에서 허용되지 않습니다.)
표현
열에 할당하는 표현식. A에서 사용되는 경우일치 할 때
절에서 표현식은 대상 테이블의 원래 행에서 값을 사용할 수 있고data_source
행. A에서 사용되는 경우일치하지 않을 때
절, 표현식은의 값을 사용할 수 있습니다data_source
행.
기본값
열을 기본값으로 설정합니다 (NULL
특정 기본 표현식이 할당되지 않은 경우).
Sub-Select
aselect
이전의 괄호 화 된 열 목록에 나열된 많은 출력 열을 생성하는 하위 쿼리. 하위 쿼리는 실행될 때 1 행을 넘어서는 안됩니다. 하나의 행을 생성하면 열 값이 대상 열에 할당됩니다. 행이 없으면 행 값이 대상 열에 할당됩니다. 하위 쿼리는 대상 스포츠 토토 결과의 원래 행의 값과의 값을 참조 할 수 있습니다.data_source
행.
성공적인 완료시 A병합
명령은 양식의 명령 태그를 반환
병합Total_Count
theTotal_Count
총 행이 변경되었는지 (삽입, 업데이트 또는 삭제하든). 만약에Total_Count
0, 어떤 식 으로든 행이 변경되지 않았습니다.
다음 단계는 실행 중에 발생합니다병합
.
이전 명령문
지정된 모든 조치에 대한 트리거언제
Clauses Match.
소스에서 대상 스포츠 토토 결과로 조인을 수행합니다. 결과 쿼리는 정상적으로 최적화되며 일련의 후보 변경 행을 생성합니다. 각 후보자 변경 행에 대해
각 행이 있는지 평가합니다일치
또는일치하지 않음
.
각각 테스트언제
진실이 반환 될 때까지 지정된 순서의 조건.
조건이 진실을 반환하면 다음 조치를 수행하십시오.
성능전 행
액션 이벤트 유형에 대한 발사 트리거.
지정된 조치를 수행하여 대상 테이블에서 확인 제약 조건을 호출합니다.
행 후
액션의 이벤트 유형에 대한 발사 트리거.
성능이후의 명령문
실제로 발생하는지 여부에 관계없이 지정된 작업에 대한 트리거. 이것은 an의 행동과 유사합니다업데이트
행을 수정하지 않는 진술.
요약하면, 이벤트 유형에 대한 명세서 트리거 (예 :삽입
) 우리가 언제마다 해고 될 것입니다지정그런 종류의 행동. 대조적으로,로드 레벨 트리거는 특정 이벤트 유형에 대해서만 발사됩니다실행. 그래서 A병합
Command Make Command Make Fire Statement Triggers업데이트
and삽입
업데이트
행 트리거가 발사되었습니다.
결합이 각 대상 행에 대해 최대 하나의 후보 변경 행을 생성해야합니다. 다시 말해, 대상 행은 둘 이상의 데이터 소스 행에 결합해서는 안됩니다. 그렇다면 후보 변경 행 중 하나만 사용하여 대상 행을 수정합니다. 나중에 행을 수정하려는 시도는 오류가 발생합니다. 행 트리거가 대상 테이블을 변경하고 그렇게 수정 된 행을이어서 이후에도 수정하면병합
. 반복적 인 행동이 인 경우삽입
, 이로 인해 고유성 위반이 발생하고 반복업데이트
또는삭제
추기경 위반을 일으킬 것입니다. 후자의 행동은에 의해 필요합니다.SQL표준. 이것은 역사적으로 다릅니다postgresql조인 동작에서업데이트
and삭제
동일한 행을 수정하려는 두 번째 및 후속 시도가 단순히 무시되는 진술.
a언제
조항은 an을 생략합니다.and
하위 클라스, 해당 종류의 최종 도달 조항이됩니다 (일치
또는일치하지 않음
). 나중에when
그러한 종류의 조항은 지정되어있을 수 없으며 오류가 발생합니다. 최종 도달 조항이 어느 한 종류로 지정되지 않으면 후보 변경 행에 대한 조치를 취하지 않을 수 있습니다.
데이터 소스에서 행이 생성되는 순서는 기본적으로 불확실합니다. 에이Source_Query
필요한 경우 일관된 순서를 지정하는 데 사용될 수 있으며, 이는 동시 거래 사이의 교착 상태를 피하기 위해 필요할 수 있습니다.
없음반환
병합
. 의 행동삽입
, 업데이트
and삭제
포함 할 수 없음반환
또는with
클로즈.
언제병합
대상 테이블을 수정하는 다른 명령과 동시에 실행되면 일반적인 트랜잭션 격리 규칙이 적용됩니다. 보다섹션 13.2각 격리 수준에서의 동작에 대한 설명. 사용을 고려하고 싶을 수도 있습니다.삽입 ... 충돌
실행 능력을 제공하는 대체 진술로서업데이트
동시에삽입
발생합니다. 두 문장 유형 사이에는 다양한 차이점과 제한이 있으며 교환 할 수 없습니다.
유지 보수 수행customer_accounts
New 기반최근_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 그때 일치 할 때 삭제;
theWine_stock_changes
예를 들어 최근 데이터베이스에로드 된 임시 스포츠 토토 결과이 될 수 있습니다.
이 명령은를 준수합니다.SQL표준.
thewith
절 및아무것도하지 않습니다
행동은에 대한 확장입니다.SQL표준.
올바른 문서에 아무것도 표시되면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면