http://en.wikipedia.org/wiki/Upsert
내가 생각하지 못한 SQLite 에서이 작업을 수행하는 영리한 방법이 있습니까?
기본적으로 레코드가 존재하면 4 개 열 중 3 개를 업데이트하고 싶습니다.없는 경우 4 번째 열의 기본 (NUL) 값으로 레코드를 삽입하고 싶습니다.
ID는 기본 키이므로 UPSERT에 대한 레코드는 하나뿐입니다.
(명확하게 업데이트하거나 삽입 해야하는 경우 결정하기 위해 SELECT의 오버 헤드를 피하려고합니다.)
제안?
TABLEite에 대한 SQLite 사이트의 구문을 확인할 수 없습니다. 테스트 할 데모를 만들지 않았지만 지원되지 않는 것 같습니다.
그렇다면 세 개의 열이 있으므로 실제로 다음과 같이 나타납니다.
CREATE TABLE table1(
id INTEGER PRIMARY KEY ON CONFLICT REPLACE,
Blob1 BLOB ON CONFLICT REPLACE,
Blob2 BLOB ON CONFLICT REPLACE,
Blob3 BLOB
);
그러나 처음 두 얼룩은 충돌을 일으키지 않으며 ID만이 가능하므로 Blob1을 asusme하고 Blob2는 (원하는대로) 교체하지 않습니다
바인딩 데이터가 완전한 트랜잭션 일 때 SQLite의 UPDATEs 업데이트 될 각 전송 된 행에는 다음이 필요합니다. 리셋 기능을 사용할 수있는 INSERT와 달리 Prepare / Bind / Step / Finalize 문
명령문 객체의 수명은 다음과 같습니다.
- sqlite3_prepare_v2 ()를 사용하여 객체를 만듭니다.
- sqlite3_bind_ 인터페이스를 사용하여 호스트 매개 변수에 값을 바인드하십시오.
- sqlite3_step ()을 호출하여 SQL을 실행하십시오.
- sqlite3_reset ()을 사용하여 명령문을 재설정 한 후 2 단계로 돌아가서 반복하십시오.
- sqlite3_finalize ()를 사용하여 명령문 오브젝트를 제거하십시오.
업데이트 INSERT에 비해 느린 것으로 생각되지만 기본 키를 사용하여 SELECT와 어떻게 비교합니까?
아마도 select를 사용하여 4 번째 열 (Blob3)을 읽은 다음 REPLACE를 사용하여 원래 4 번째 열을 처음 3 열의 새 데이터와 혼합하는 새 레코드를 작성해야합니까?