병합(SQL)

Merge (SQL)

SQL을 사용하는 관계형 데이터베이스 관리 시스템 MERGE(업서트라고도 함) 에 대한 진술INSERT신기록 또는UPDATE조건 일치 여부에 따라 기존 기록공식적으로 SQL:2003 표준에 도입되었고, SQL:2008 표준에 확대되었다.null

사용법

병합 INO 탭 이름 사용. table_참조 켜기 (조건)   언제 일치됨 그럼     갱신하다 세트 컬럼1 = 값1 [, column2 = value2 ...]   언제 NOT 일치됨 그럼     삽입 (컬럼1 [, column2 ...]) 가치 (값1 [, value2 ...]); 

오른쪽 조인은 Target(ITUT 테이블) 및 Source(USINT 테이블/view/sub-query)를 통해 사용된다. 여기서 Target은 왼쪽 테이블이고 Source는 오른쪽 테이블이다.가능한 네 가지 조합은 다음과 같은 규칙을 산출한다.

  • 소스의 ON 필드가 대상의 ON 필드와 일치하면 UPDATE
  • 소스의 ON 필드가 대상의 ON 필드와 일치하지 않으면 INSERT
  • ON 필드가 Source에 존재하지 않지만 Target에 존재한다면 어떠한 작업도 수행되지 않는다.
  • ON 필드가 Source 또는 Target에 없는 경우 어떠한 작업도 수행되지 않는다.

여러 원본 행이 지정된 대상 행과 일치하면 SQL:2003 표준에 의해 오류가 의무화된다.MERGE 문으로 대상 행을 여러 번 업데이트할 수 없음

구현

데이터베이스 관리 시스템 Oracle Database, DB2, Teradata, EXASOL, Firebird, CUBRID, H2, HSQLDB, MS SQL, VectorwiseApache Derby는 표준 구문을 지원한다.일부에서는 비표준 SQL 확장자를 추가하기도 한다.null

동의어

일부 데이터베이스 구현에서는 레코드가 존재하지 않거나 레코드가 이미 존재하는 경우 기존 레코드를 업데이트하는 데이터베이스 문 또는 문장의 조합에 "Uspert"(업데이트삽입portmantau)라는 용어를 채택했다.이 동의어는 PostgreSQL (v9.5+)[1]SQLite (v3.24+)[2]에서 사용된다.또한 "MERGE"에 상당하는 사이비 코드를 축약하는 데도 사용된다.null

마이크로소프트 SQL Azure에서 사용된다.[3]null

기타 비표준 구현

일부 다른 데이터베이스 관리 시스템은 자체 비표준 SQL 확장을 통해 이 동작 또는 매우 유사한 동작을 지원한다.null

예를 들어 MySQL은INSERT ... ON DUPLICATE KEY UPDATEANSI/ISO 표준에서는 필요하지 않은 Primary KEY 또는 Unique 제약 조건에서만 대상과 소스 간의 결합이 이루어져야 한다는 제한으로 유사한 효과를 얻기 위해 사용할 수 있는 구문[4].그것은 또한 지원한다.REPLACE INTO구문 [5]- 먼저 삽입을 시도하고, 실패한 경우 행이 있으면 삭제하고, 새 행을 삽입한다.또한 an도 있다.IGNORE에 대한 조항INSERT서버에게 "실행 키" 오류를 무시하고 계속 진행하도록 지시하는 문장([6]기존 행은 삽입 또는 업데이트되지 않지만 모든 새 행이 삽입됨).null

SQLite의INSERT OR REPLACE INTO유사하게 작용하다그것은 또한 지원한다.REPLACE INTOMySQL과의 호환성을 위한 별칭으로 사용.[7]

파이어버드 지지대MERGE INTO그러나 소스 데이터 행이 여러 개 있을 경우 오류를 발생시키지 못한다.또한 단일 행 버전이 있다.UPDATE OR INSERT INTO tablename (columns) VALUES (values) [MATCHING (columns)]그러나 후자는 삽입 대 업데이트에 대해 다른 작업을 수행할 수 있는 옵션을 제공하지 않는다(예: 기존 행이 아닌 새 행에 대해서만 새 시퀀스 값을 설정).null

IBM DB2는 여러 개의 구문을 확장함WHEN MATCHED그리고WHEN NOT MATCHED조항들, 그것들과 구별하는 조항들... AND some-condition 경비병들

Microsoft SQL Server는 가드를 지원하고 다음을 통해 왼쪽 연결 지원WHEN NOT MATCHED BY SOURCE조항들null

PostgreSQL은 다음을 통해 병합 지원INSERT INTO ... ON CONFLICT [ conflict_target ] conflict_action.[8]

CUBRID 지지대MERGE INTO[9] 명세서그리고 의 사용을 지원한다.INSERT ... ON DUPLICATE KEY UPDATE구문.[10]그것은 또한 지원한다.REPLACE INTOMySQL과의 호환성을 위해.[11]

Apache Phoenix 지원UPSERT VALUES[12] 그리고UPSERT SELECT[13] 구문.null

스파크 SQL 지원UPDATE SET *그리고INSERT *행동 [14]조항

아파치 임팔라 지원UPSERT INTO ... SELECT.[15]

NoSQL의 사용

유사한 개념이 일부 NoSQL 데이터베이스에 적용된다.null

예: MongoDB에서 키와 관련된 값의 필드를update작전update키를 찾을 수 없는 경우 오류를 발생시킨다.에서update작동 설정 가능upsert플래그: 이 경우 새 값이 해당 키와 연관되어 저장되며, 그렇지 않으면 전체 값이 대체된다.null

Redis에서SEToperations는 지정된 키와 연관된 값을 설정한다.Redis는 값의 내부 구조에 대한 세부사항을 알지 못하므로 업데이트는 의미가 없을 것이다.그래서 더SET운영에는 항상 의미론이 설정되거나 대체된다.null

참고 항목

참조

  1. ^ PostgreSQL-tutorial
  2. ^ upsert sqlite.org 6-6-2018 방문
  3. ^ Transact-SQL 참조(Database Engine): MERGE(Transact-SQL)
  4. ^ MySQL :: MySQL 5.1 참조 설명서 : 12.2.4.3 INSERT...중복된 키 업데이트 구문
  5. ^ MySQL 5.1 참조 설명서: 11.2.6 교체 구문
  6. ^ "MySQL 5.5 Reference Manual :: 13.2.5 INSERT Syntax". Retrieved 29 October 2013.
  7. ^ "SQL As Understood By SQLite: INSERT". Retrieved 2012-09-27.
  8. ^ PostgreSQL INSERT 페이지
  9. ^ "New CUBRID 9.0.0". CUBRID Official Blog. 2012-10-30. Retrieved 2012-11-08.
  10. ^ CUBRID : : 데이터 조작 문 : : 삽입 : : : 중복 KEY UPDATE 절에 ON
  11. ^ CUBRID :: 데이터 조작 문 :: 교체
  12. ^ "UPSERT VALUES".
  13. ^ "UPSERT SELECT".
  14. ^ "MERGE INTO (Delta Lake on Databricks)".
  15. ^ "UPSERT Statement (Apache Impala Documentation)".

외부 링크