Tive um problema com a instrução UPSERT no SQLite. Eu tenho um banco de dados mestre e um escravo, as atualizações no banco de dados escravo devem ser mescladas no banco de dados mestre. Eu gostaria de usar a cláusula UPSERT. Isso funciona para inserir values()
, mas não para inserir de uma subconsulta.
A documentação (pelo menos o diagrama) mostra que deve funcionar: https://www.sqlite.org/lang_insert.html
Mas estou recebendo um erro. Estou esquecendo de algo?
sqlite> create table orig (id int unique, a int);
sqlite> create table copy (id int unique, a int);
sqlite> insert into orig values (1,0);
sqlite> insert into copy values (1,0);
sqlite> insert into orig values (1,1) on conflict do update set a=1;
sqlite> select * from orig;
1|1
sqlite> insert into orig select * from copy on conflict do update set a=2;
Parse error: near "do": syntax error
insert into orig select * from copy on conflict do update set a=2;
error here ---^
Eu também tentei expressões diferentes, mas sem sucesso:
sqlite> insert into orig select * from copy on conflict do nothing;
Parse error: near "do": syntax error
insert into orig select * from copy on conflict do nothing;
error here ---^
sqlite> insert into orig select * from copy on conflict (id) do update set a=2;
Parse error: near "do": syntax error
ert into orig select * from copy on conflict (id) do update set a=2;
error here ---^
sqlite3 --version 3.40.1 2022-12-28
Isso é explicado na seção Parsing Ambiguity da entrada do manual no UPSERT :
Portanto, para resolver seu problema, você precisa adicionar o redundante
where true
logo antes do upserton
:Demonstração ao vivo