어떤 애플리케이션에서든 데이터베이스 테이블에 레코드를 추가하고 해당 레코드에 저장된 정보를 변경해야 합니다. 업데이트 SQL 문은 데이터베이스에 이미 저장된 데이터를 변경하고 삽입 문은 테이블에 새 레코드를 추가합니다. UPSERT 선언문은 삽입과 업데이트의 조합이며, 업데이트가 수행되거나 기록이 존재하지 않는 경우 기록을 추가합니다. 여기서는 SQL UPDATE vs. INSERT vs. UPSERT에 대해 알아보겠습니다.
SQL에서 업데이트를 사용하는 방법: 예시
업데이트 선언문은 사용자가 지정한 새로운 정보로 현재 레코드를 업데이트합니다. 예를 들어, 고객은 전자상거래 테이블에서 연락처 정보를 이동 및 변경할 수 있으며, 업데이트 내역서가 변경을 수행합니다. 데이터베이스에서 변경한 내용은 업데이트 선언문을 사용합니다.
쿼리를 최적화하면 데이터베이스 지연이 감소한다는 점을 유념해야 합니다. 최적화된 업데이트 쿼리는 데이터 처리를 단 밀리초로 줄일 수 있습니다. 또한 인프라는 대용량 데이터베이스 서버의 낮은 레이턴시에 중요합니다. 다음 쿼리를 사용하여 시작하십시오. 일반적으로 업데이트되는 인덱싱 열은 성능을 개선하는 데 도움이 될 수 있습니다. 대규모 동시적 워크로드의 경우, 데이터베이스 개발자는 격리 수준을 사용하여 스테이트먼트가 다른 스테이트먼트에도 영향을 미치지 않도록 보호해야 할 수 있습니다.
개발자와 데이터베이스 관리자는 코드에 오류가 있어야 합니다. 이 예제는 각 명령을 수행하는 방법을 보여주지만, 비즈니스 로직은 오류가 발생하는 경우 어떻게 해야 하는지 결정해야 합니다. 예를 들어, 데이터베이스가 새 고객 레코드를 삽입하지 못하는 경우, 사용자에게 다시 시도하도록 알리거나 고객 서비스에 문의하십시오. 성능 모니터링 툴을 사용하면 데이터베이스 지연, 오류 및 최적화 경고를 수행할 수 있습니다.
대부분의 SQL 업데이트 문에는 WHERE 절을 사용합니다. WHERE 절은 어떤 기록이 업데이트될지 결정하고 다른 기록은 그대로 둡니다. UPDATE 문을 실행할 때 WHERE 절을 사용하지 않으면 데이터베이스가 데이터베이스의 모든 레코드를 변경하므로 오류가 발생할 수 있습니다. 이러한 실수를 방지하기 위해 SQL 문에 WHERE 절이 있는지 확인하십시오.
UPDATE 문 구문은 사용하는 데이터베이스 엔진에 따라 다릅니다. MySQL 및 Oracle SQL 데이터베이스는 업데이트 구문에 유사한 구문을 사용합니다. 다음 예는 고객의 ID가 44인 경우 고객의 이름을 “john”으로 변경합니다.
MySQL: 업데이트 명령
|
1 2 3 4 5 |
고객 업데이트 SET first_name = ‘존’ 여기서 id = 44; |
Oracle SQL: 업데이트 명령
|
1 2 3 4 5 |
고객 업데이트 SET first_name = ‘존’ 여기서 id = 44; |
SQL에서 삽입을 사용하는 방법: 예시
테이블에 새 레코드를 추가하려면 SQL 문 삽입을 사용합니다. 대부분의 데이터베이스 설계자는 모든 레코드에 고유한 식별자를 제공하는 기본 열을 생성합니다. 고유 식별자가 자동으로 채워지므로 수동으로 삽입하지 않고 데이터베이스 엔진이 이를 대신하도록 허용합니다. 중복 값을 식별자 행에 삽입할 수 없으므로 데이터베이스가 이를 대신 수행할 수 있도록 하는 것이 더 효율적입니다.
다음 예에서는 이름 및 성이 해당 열에 채워진 신규 고객이 고객 테이블에 추가됩니다. 열은 각 열에 추가할 값과 함께 정의됩니다.
MySQL: 업데이트 명령
|
1 2 3 4 5 6 7 |
고객에게 삽입하기 (first_name, last_name) 가치(‘존’, ‘스미스’) Oracle SQL: 업데이트 명령 고객에게 삽입하기 (first_name, last_name) 가치(‘존’, ‘스미스’) |
SQL에서 UPSERT를 사용하는 방법: 예시
UPSERT 명령은 행이 존재하지 않는 경우에만 삽입할 때 유용합니다. 이미 존재하는 경우, 데이터베이스는 새로운 정보로 기록을 업데이트합니다. Oracle 데이터베이스 엔진에는 특정 UPSERT 명령이 있습니다. MySQL에서 명령은 대신 REPLACE라는 용어를 사용합니다.
애플리케이션 개발자는 UPSERT 명령을 사용하여 중복된 레코드, 특히 고유한 식별자가 연결되어 있는 레코드를 방지하며, 애플리케이션 내역서는 기존 레코드로 인해 레코드를 삽입해서는 안 됩니다. 한 테이블에서 다른 테이블로 데이터를 가져올 때 종종 발생하며, 중복 레코드가 존재할 수 있습니다. 예를 들어, 인수한 비즈니스에서 고객 레코드 목록을 얻고 일부 고객이 이미 현재 비즈니스 데이터베이스에 있음을 알 수 있습니다. UPSERT 선언문은 기존 고객만 업데이트하고 기존 고객이 없는 경우 새로운 고객을 추가합니다.
MySQL: 업데이트 명령
|
1 2 3 |
고객(id, first_name, last_name) 가치 (44, ‘존’, ‘스미스’) |
위의 예에서는 식별자가 44인 고객이 이미 존재하는 경우 원본 레코드가 삭제되고 식별자가 44인 새 고객 레코드가 추가됩니다. REPLACE 명령은 기술적으로 어떠한 데이터도 업데이트하지 않는다는 점을 기억하는 것이 중요합니다. 대신 행을 삭제하고 테이블에 다시 추가합니다.
Oracle SQL: 업데이트 명령
|
1 2 3 |
UPSERT 고객(id, first_name, last_name) 가치 (44, ‘존’, ‘스미스’) |
Oracle의 경우, UPSERT 명령은 삭제 및 재추가가 아닌 44의 식별자로 고객을 업데이트합니다. 레코드가 없으면 Oracle 엔진이 테이블에 고객 레코드를 추가합니다.
PostGreSQL: INSERT 명령
PostGreSQL에는 특정 UPSERT 문이 없지만 서버가 새 레코드가 없는 경우에만 삽입하는 INSERT 유형을 지원합니다. 기록이 존재하는 경우, 테이블 제약은 오류를 발생시키고 INSERT 문이 아닌 업데이트를 수행해야 합니다. PostGreSQL 구문은 다음과 같습니다.
|
1 2 3 4 5 6 7 8 9 10 11 |
제품에 삽입(ID, 이름, 가격, 수량) 가치 (1, ‘WidgetA’, 20.99, 90) 충돌 시(id) 업데이트 설정 실행 가격 = EXCLUD.price, 제외 가격 수량 = EXCLUDED.quantity; |
SQL Server: MERGE 명령
Microsoft SQL Server는 또한 UPSERT 문을 지원하지 않지만, 개발자는 MERGE 명령을 사용하여 유사한 작업을 수행할 수 있습니다. MERGE 문은 소스 데이터세트를 가져와 테이블과 병합하지만 행이 없는 경우에만 새 레코드를 삽입합니다. 행이 있는 경우, MERGE 문이 기록을 업데이트합니다.
|
1 2 3 4 5 6 7 |
MERGE 제품 P P.ID=S.ID new_products_source S 사용 매칭 시 업데이트 설정 가격=S.price, 이름=S.name, 수량=S.quantity; |
MongoDB: 업데이트 명령
MongoDB에는 데이터베이스가 UPSERT 문을 실행하도록 알려주는 UPDATE 명령 매개변수가 있습니다. 다른 데이터베이스와 마찬가지로 MongoDB는 레코드가 없는 경우에만 새 레코드를 삽입합니다. 데이터베이스가 존재하는 경우, 데이터베이스가 레코드를 실행하고 업데이트합니다.
|
1 2 3 4 5 6 7 8 9 |
db.products.update( { title: “Red Widget” }, { $inc: { price: 19.00 } }, { upsert: true } ) |
업데이트 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
유니크한 대비 SQL에서 고유함
이제 업데이트, 삽입 및 UPSERT를 언제 사용해야 하는지에 대해 살펴보았으므로, 다음 단계로 넘어가 쿼리 시간에 중복 값을 제어해야 할 때 DISTINCT 와 UNIQUE 가 어떻게 다른지 명확히 하십시오.




