SQL 업데이트 vs. 삽입 vs. UPSERT

이 문서에서는 세 가지 SQL 구문을 살펴봅니다. 업데이트, 삽입 및 UPSERT. 사용 방법 및 시기에 대한 예시가 포함되어 있습니다.

SQL UPDATE vs. INSERT vs. UPSERT

어떤 애플리케이션에서든 데이터베이스 테이블에 레코드를 추가하고 해당 레코드에 저장된 정보를 변경해야 합니다. 업데이트 SQL 문은 데이터베이스에 이미 저장된 데이터를 변경하고 삽입 문은 테이블에 새 레코드를 추가합니다. UPSERT 선언문은 삽입과 업데이트의 조합이며, 업데이트가 수행되거나 기록이 존재하지 않는 경우 기록을 추가합니다. 여기서는 SQL UPDATE vs. INSERT vs. UPSERT에 대해 알아보겠습니다.

SQL에서 업데이트를 사용하는 방법: 예시

업데이트 선언문은 사용자가 지정한 새로운 정보로 현재 레코드를 업데이트합니다. 예를 들어, 고객은 전자상거래 테이블에서 연락처 정보를 이동 및 변경할 수 있으며, 업데이트 내역서가 변경을 수행합니다. 데이터베이스에서 변경한 내용은 업데이트 선언문을 사용합니다.

쿼리를 최적화하면 데이터베이스 지연이 감소한다는 점을 유념해야 합니다. 최적화된 업데이트 쿼리는 데이터 처리를 단 밀리초로 줄일 수 있습니다. 또한 인프라는 대용량 데이터베이스 서버의 낮은 레이턴시에 중요합니다. 다음 쿼리를 사용하여 시작하십시오. 일반적으로 업데이트되는 인덱싱 열은 성능을 개선하는 데 도움이 될 수 있습니다. 대규모 동시적 워크로드의 경우, 데이터베이스 개발자는 격리 수준을 사용하여 스테이트먼트가 다른 스테이트먼트에도 영향을 미치지 않도록 보호해야 할 수 있습니다.

개발자와 데이터베이스 관리자는 코드에 오류가 있어야 합니다. 이 예제는 각 명령을 수행하는 방법을 보여주지만, 비즈니스 로직은 오류가 발생하는 경우 어떻게 해야 하는지 결정해야 합니다. 예를 들어, 데이터베이스가 새 고객 레코드를 삽입하지 못하는 경우, 사용자에게 다시 시도하도록 알리거나 고객 서비스에 문의하십시오. 성능 모니터링 툴을 사용하면 데이터베이스 지연, 오류 및 최적화 경고를 수행할 수 있습니다.

SQL 업데이트: 예

대부분의 SQL 업데이트 문에는 WHERE 절을 사용합니다. WHERE 절은 어떤 기록이 업데이트될지 결정하고 다른 기록은 그대로 둡니다. UPDATE 문을 실행할 때 WHERE 절을 사용하지 않으면 데이터베이스가 데이터베이스의 모든 레코드를 변경하므로 오류가 발생할 수 있습니다. 이러한 실수를 방지하기 위해 SQL 문에 WHERE 절이 있는지 확인하십시오.

UPDATE 문 구문은 사용하는 데이터베이스 엔진에 따라 다릅니다. MySQL 및 Oracle SQL 데이터베이스는 업데이트 구문에 유사한 구문을 사용합니다. 다음 예는 고객의 ID가 44인 경우 고객의 이름을 “john”으로 변경합니다.

SQL에서 삽입을 사용하는 방법: 예시

테이블에 새 레코드를 추가하려면 SQL 문 삽입을 사용합니다. 대부분의 데이터베이스 설계자는 모든 레코드에 고유한 식별자를 제공하는 기본 열을 생성합니다. 고유 식별자가 자동으로 채워지므로 수동으로 삽입하지 않고 데이터베이스 엔진이 이를 대신하도록 허용합니다. 중복 값을 식별자 행에 삽입할 수 없으므로 데이터베이스가 이를 대신 수행할 수 있도록 하는 것이 더 효율적입니다.

다음 예에서는 이름 및 성이 해당 열에 채워진 신규 고객이 고객 테이블에 추가됩니다. 열은 각 열에 추가할 값과 함께 정의됩니다.

SQL에서 UPSERT를 사용하는 방법: 예시

UPSERT 명령은 행이 존재하지 않는 경우에만 삽입할 때 유용합니다. 이미 존재하는 경우, 데이터베이스는 새로운 정보로 기록을 업데이트합니다. Oracle 데이터베이스 엔진에는 특정 UPSERT 명령이 있습니다. MySQL에서 명령은 대신 REPLACE라는 용어를 사용합니다.

애플리케이션 개발자는 UPSERT 명령을 사용하여 중복된 레코드, 특히 고유한 식별자가 연결되어 있는 레코드를 방지하며, 애플리케이션 내역서는 기존 레코드로 인해 레코드를 삽입해서는 안 됩니다. 한 테이블에서 다른 테이블로 데이터를 가져올 때 종종 발생하며, 중복 레코드가 존재할 수 있습니다. 예를 들어, 인수한 비즈니스에서 고객 레코드 목록을 얻고 일부 고객이 이미 현재 비즈니스 데이터베이스에 있음을 알 수 있습니다. UPSERT 선언문은 기존 고객만 업데이트하고 기존 고객이 없는 경우 새로운 고객을 추가합니다.

위의 예에서는 식별자가 44인 고객이 이미 존재하는 경우 원본 레코드가 삭제되고 식별자가 44인 새 고객 레코드가 추가됩니다. REPLACE 명령은 기술적으로 어떠한 데이터도 업데이트하지 않는다는 점을 기억하는 것이 중요합니다. 대신 행을 삭제하고 테이블에 다시 추가합니다.

Oracle의 경우, UPSERT 명령은 삭제 및 재추가가 아닌 44의 식별자로 고객을 업데이트합니다. 레코드가 없으면 Oracle 엔진이 테이블에 고객 레코드를 추가합니다.

PostGreSQL에는 특정 UPSERT 문이 없지만 서버가 새 레코드가 없는 경우에만 삽입하는 INSERT 유형을 지원합니다. 기록이 존재하는 경우, 테이블 제약은 오류를 발생시키고 INSERT 문이 아닌 업데이트를 수행해야 합니다. PostGreSQL 구문은 다음과 같습니다.

Microsoft SQL Server는 또한 UPSERT 문을 지원하지 않지만, 개발자는 MERGE 명령을 사용하여 유사한 작업을 수행할 수 있습니다. MERGE 문은 소스 데이터세트를 가져와 테이블과 병합하지만 행이 없는 경우에만 새 레코드를 삽입합니다. 행이 있는 경우, MERGE 문이 기록을 업데이트합니다. 

MongoDB에는 데이터베이스가 UPSERT 문을 실행하도록 알려주는 UPDATE 명령 매개변수가 있습니다. 다른 데이터베이스와 마찬가지로 MongoDB는 레코드가 없는 경우에만 새 레코드를 삽입합니다. 데이터베이스가 존재하는 경우, 데이터베이스가 레코드를 실행하고 업데이트합니다.

업데이트 vs. 삽입: SQL의 차이점

대부분의 애플리케이션은 여러 업데이트 및 삽입문을 사용하여 데이터를 관리합니다. 기록을 추가해야 할 때 진술문을 삽입해야 합니다. 이미 저장된 데이터를 변경해야 하는 경우, 업데이트 내역서가 필요합니다.

INSERT 문에는 필요한 값으로 채워야 하는 모든 열이 필요합니다. 업데이트 선언문에는 WHERE 절이 필요하지 않지만, 이를 제외하면 모든 레코드가 주어진 데이터로 업데이트됩니다. 모든 기록을 업데이트하고 싶을 가능성은 낮으므로 WHERE 절을 포함시키세요.

INSERT 대신 UPDATE를 사용할 수는 없지만, UPSERT 문은 좋은 대안입니다. UPSERT 문을 사용하면 데이터베이스가 사용 가능한 레코드를 업데이트하고 레코드가 없는 경우 테이블에 삽입합니다. INSERT는 데이터베이스가 올바르게 최적화되었다면 업데이트 선언보다 빠릅니다.

UPSERT vs. 업데이트 및 삽입: 어떤 것이 더 좋을까요?

사용하는 문구는 데이터베이스의 데이터로 수행할 작업에 따라 다릅니다. 성능을 위해 INSERT는 UPSERT보다 낫지만, 항상 업데이트 문구 사용을 피할 수는 없으며, 기록이 아직 존재하지 않는지 확인할 수 있는 방법이 필요합니다. UPSERT 선언문은 저장된 절차에서 더 긴 IF 선언문을 작성하는 대신 전체 프로세스를 간소화합니다. 대규모 업데이트가 있거나 명세서를 삽입하여 데이터를 가져오고 중복되는 것을 원하지 않는 경우, UPSERT 명세서가 성능에 더 적합합니다. 업데이트와 삽입을 한 번에 완료하면 됩니다.

SQL에서 업데이트를 사용해야 하는 경우

데이터베이스 테이블에서 데이터를 변경하는 유일한 방법은 업데이트문입니다. 애플리케이션은 다양한 이유로 데이터를 지속적으로 변경하며 백엔드에 SQL UPDATE 문을 사용합니다. 온라인에서 고객 번호의 연락처 정보, 신용카드 데이터 또는 배송 주소를 변경하면 백엔드 애플리케이션 시스템이 업데이트 내역서를 실행할 수 있습니다.

데이터를 편집하기만 하면 되며 중복은 문제가 되지 않을 때 업데이트 기능을 사용하십시오. 간단한 업데이트 문구는 느려지지 않지만, 편집해야 하는 열과 행이 많을수록 데이터베이스 서비스가 느려질 수 있습니다. 비수기 시간에 대규모 배치 업데이트 내역서를 수행하는 것이 도움이 될 수 있습니다.

SQL에서 삽입을 사용해야 하는 경우

테이블에 레코드를 추가하려면 INSERT 문이 필요합니다. 애플리케이션에 등록하거나 전자상거래 스토어에서 신제품을 주문할 때마다 백엔드 데이터베이스는 INSERT SQL 문을 사용하여 데이터베이스에 새 레코드를 추가합니다. 새 레코드는 업데이트 내역서로 나중에 변경할 수 있지만, INSERT 내역서로 처음 생성됩니다.

삽입 문구는 일반적으로 빠릅니다. 레코드를 추가해야 하는 경우 불가피합니다. 업데이트 문구와 마찬가지로, 대규모 삽입(예: 정적 파일에서 데이터 가져오기)은 오프피크 시간대에 실행되는 경우 최적화가 더 좋을 수 있습니다. 감사 및 로깅을 위한 로그 파일은 간단한 INSERT 문을 사용합니다.

SQL에서 UPSERT를 사용해야 하는 경우

UPSERT 선언문은 세 가지 명령 중 성능이 가장 낮지만, 테이블에 추가할 레코드가 여러 개 있고 복제를 원하지 않을 때 사용됩니다. 데이터를 테이블로 가져오고 중복 레코드가 있을 수 있다고 생각하는 경우, 중복 레코드를 추가하는 대신 UPSERT 문을 사용하여 현재 레코드를 업데이트하십시오. 예를 들어, 외부 파일에서 데이터베이스 테이블로 고객을 가져와야 하는 경우, INSERT 문을 사용하는 것보다 UPSERT 문이 더 적절할 수 있습니다.

UPSERT 문은 중복될 수 있는 대용량 소스 데이터셋이 있는 경우 일반적으로 유용합니다. 예를 들어, 제품 테이블을 복제하고 싶지 않기 때문에, 하나의 INSERT 문을 사용하고 나중에 복제본을 제거하는 대신 UPSERT를 사용합니다. UPSERT는 대량의 데이터 배치가 있을 때 좋지만, 모든 INSERT 문에 불필요하게 사용될 경우 지연 문제를 일으킬 수 있습니다. 기본 테이블로 중복 항목을 가져올 수 있는 경우에만 UPSERT를 사용하십시오.

FAQ

UPSERT는 충돌 감지 및 해결이 단일 원자 작업 내에서 처리되기 때문에 높은 동시성 하에서 수동으로 롤링한 “선택 후 삽입” 로직보다 일반적으로 안전합니다. 데이터베이스가 충돌을 신속하게 해결하고 불필요한 잠금이나 경합을 피할 수 있도록 올바른 인덱스와 고유한 제약이 있는지 확인해야 합니다.

중복을 방지하는 가장 신뢰할 수 있는 방법은 고유해야 하는 열 또는 열 세트에 기본 키 또는 고유한 제약 조건을 정의한 다음, 해당 제약 조건에 인서트 또는 UPSERT를 쓰는 것입니다. 데이터베이스 엔진은 쓰기 시간에 고유성을 적용하며, 애플리케이션 코드의 기존 행을 수동으로 확인하는 것보다 더 안정적입니다.

UPSERT는 사용자 ID 또는 주문 ID와 같은 키를 기반으로 동일한 레코드를 정기적으로 생성하거나 업데이트해야 하는 경우에 가장 유용합니다. 애플리케이션 로직을 간소화하고, “체크 후 삽입” 패턴으로 인한 레이스 조건의 가능성을 줄이며, 별도의 삽입 및 업데이트 명세서를 발행하는 것보다 데이터베이스로의 왕복 이동이 적은 경우가 많습니다.

INSERT 는 완전히 새로운 행을 추가하고, 업데이트 는 이미 사용자의 기준과 일치하는 기존 행을 변경하며, UPSERT 는 존재하지 않을 때 새 행을 삽입하거나 일치하는 행이 발견될 때 기존 행을 업데이트하여 두 가지 동작을 결합합니다. ‘생성’, ‘수정’, ‘생성 또는 수정’의 관점에서 생각할 때, 각 활용 사례에 적합한 문장을 선택하는 데 도움이 될 수 있습니다.