SQLite - UPSERT * não * INSERIR ou SUBSTITUIR

http://en.wikipedia.org/wiki/Upsert

Inserir processo armazenado de atualização no SQL Server

Existe alguma maneira inteligente de fazer isso no SQLite que eu não tenha pensado?

Basicamente, quero atualizar três das quatro colunas se o registro existir. Se ele não existir, insira o registro com o valor padrão (NUL) da quarta coluna.

O ID é uma chave primária, portanto, sempre haverá um registro para a UPSERT.

(Estou tentando evitar a sobrecarga de SELECT para determinar se preciso atualizar ou inserir obviamente)

Sugestões?

Não posso confirmar essa sintaxe no site SQLite para TABLE CREATE. Eu não construí uma demonstração para testá-la, mas ela não parece ser suportada.

Se fosse, eu tenho três colunas, então seria assim:

CREATE TABLE table1( 
    id INTEGER PRIMARY KEY ON CONFLICT REPLACE, 
    Blob1 BLOB ON CONFLICT REPLACE, 
    Blob2 BLOB ON CONFLICT REPLACE, 
    Blob3 BLOB 
);

mas os dois primeiros blobs não causam conflito, apenas o ID causaria. Então, eu usava o Blob1 e o Blob2 não seriam substituídos (conforme desejado)

ATUALIZAÇÕES no SQLite quando os dados de ligação são uma transação completa, o que significa que cada linha enviada a ser atualizada requer: Instruções de Preparação / Ligação / Etapa / Finalização ao contrário do INSERT, que permite o uso da função de redefinição

A vida de um objeto de instrução é mais ou menos assim:

Crie o objeto usando sqlite3_prepare_v2 ()Vincule valores aos parâmetros do host usando interfaces sqlite3_bind_.Execute o SQL chamando sqlite3_step ()Redefina a instrução usando sqlite3_reset (), volte para a etapa 2 e repita.Destrua o objeto de instrução usando sqlite3_finalize ().

ATUALIZAÇÃO Acho que é lento comparado ao INSERT, mas como ele se compara ao SELECT usando a chave Primária?

Talvez eu deva usar o select para ler a 4ª coluna (Blob3) e, em seguida, usar REPLACE para escrever um novo registro misturando a 4ª coluna original com os novos dados para as 3 primeiras colunas?

questionAnswers(17)

yourAnswerToTheQuestion