SQLite, таблица с первичным ключем.
Ну например такая:
create table Tbl(id integer primary key,
val1 varchar,
val2 varchar);
Необходимо: вставить запись в таблицу (если записи с таким ПК нет) или изменить, если такой ПК есть. У SQLite для этого можно использовать "расширенный" вариант insert'а — insert or replace:
(1) insert or replace into tbl(id,val1,val2) values(?1,?2,?3);
(2) insert or replace into tbl(id,val1) values(?1,?2);
Если запись с таким id есть: в (1) варианте я меняю оба поля, в варианте (2) — вроде только одно.
Но для случая (2) поле val2 тоже меняется (на NULL либо DEFAULT если задан)! Чего естественно не планировалось.
Пробовал вариант: insert or replace into tbl(id,val1,val2) values(?1,?2,val2) — ругается.
Счас остановился на таком:
insert or replace into tbl(id,val1,val2)
select ?1,?2,val2
from tbl
where id=?1;
работает, но ИМХО попахивает извратом. Вопрос: можно ли проще?
И более широкий вопрос: в других SQL'ах с которыми я работал, подобная операция (т.е. update если есть, insert если нет) также обычно по-простому не решается. Это действительно так или просто у меня такое впечатление (готовить не умею?)? И насколько вообще актуальна подобная операция (может это просто мне "везло")?