SQLite "частичный" insert or replace
От: alexqc Россия
Дата: 24.09.07 14:30
Оценка:
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 если нет) также обычно по-простому не решается. Это действительно так или просто у меня такое впечатление (готовить не умею?)? И насколько вообще актуальна подобная операция (может это просто мне "везло")?
Живи, Україно, прекрасна і сильна
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.