집 >데이터 베이스 >MySQL 튜토리얼 >SQLite의 UPSERT는 부분 업데이트 및 삽입을 어떻게 효율적으로 처리합니까?
SQLite의 UPSERT 기능 이해
INSERT와 UPDATE가 결합된 UPSERT 작업은 필요에 따라 기존 레코드를 업데이트하거나 새 레코드를 삽입하여 데이터 수정을 효율적으로 처리합니다. SQLite는 UPSERT를 직접 지원하지만 부분 업데이트에 대한 사용을 최적화하려면 신중한 고려가 필요합니다.
SQLite의 UPSERT 구문
SQLite 버전 3.24.0에 도입된 ON CONFLICT
절을 사용하면 UPSERT를 정확하게 제어할 수 있습니다. 예:
<code class="language-sql">INSERT OR REPLACE INTO table (id, name) VALUES (1, 'John Foo') ON CONFLICT(id) DO UPDATE SET name = 'John Foo';</code>
일치하는 name
레코드가 있는 경우 id
필드를 업데이트합니다. 그렇지 않으면 새 행을 삽입합니다.
부분 업데이트 해결
다른 열은 그대로 두고 특정 열만 수정하는 부분 업데이트 관리는 어려운 일입니다. 다음 시나리오를 고려해보세요. Blob1
및 Blob2
를 업데이트하고 레코드가 존재하는 경우 Blob3
을 변경하지 않고 그대로 둡니다. 그렇지 않은 경우 Blob3
를 NULL로 설정하세요.
효율적인 부분 업데이트 솔루션
ON CONFLICT
절은 우아한 솔루션을 제공합니다.
<code class="language-sql">INSERT INTO table (id, Blob1, Blob2, Blob3) VALUES (1, 'Data1', 'Data2', NULL) ON CONFLICT(id) DO UPDATE SET Blob1 = 'Data1', Blob2 = 'Data2';</code>
이 접근 방식은 충돌(Blob1
일치)이 발생할 때 Blob2
및 id
만 업데이트합니다. 중요한 것은 레코드가 없으면 INSERT
는 Blob3
를 지정된 대로 NULL로 설정합니다.
대체 방법(덜 효율적임)
또는 SELECT
및 REPLACE
조합을 사용하여 동일한 결과를 얻을 수 있습니다.
<code class="language-sql">SELECT name INTO @name FROM Employee WHERE id = 1; REPLACE INTO Employee (id, role) VALUES (1, 'code monkey', @name);</code>
미리 읽어보면 원래의 name
값이 보존됩니다. 그러나 이 방법은 일반적으로 ON CONFLICT
접근 방식
위 내용은 SQLite의 UPSERT는 부분 업데이트 및 삽입을 어떻게 효율적으로 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!