Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Особенность SQLite синтаксиса / 6 сообщений из 6, страница 1 из 1
27.03.2014, 12:15
    #38597916
harisma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенность SQLite синтаксиса
В обычном SQL есть такой синтаксис:
Код: sql
1.
2.
3.
4.
IF NOT EXISTS(Select * from SomeTable where ...) 
  INSERT INTO SomeTable (<Fields>) Values (<Values>)
ELSE
  UPDATE SomeTable SET Field1 = Value1, ... FieldN = ValueN



В SQLite такая конструкция не работает. А какая работает?
...
Рейтинг: 0 / 0
27.03.2014, 13:41
    #38598072
PPA
PPA
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенность SQLite синтаксиса
...
Рейтинг: 0 / 0
27.03.2014, 14:11
    #38598111
harisma
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенность SQLite синтаксиса
PPA,

Спасибо. Эту ссылку я уже смотрел. Не понятно только как получить значение affected row count?

Посмотрел я еще вот такую ссылку, на этом же стековерфлове - http://stackoverflow.com/questions/418898/sqlite-upsert-not-insert-or-replace
мне предложенное решение показалось работоспособным. Но поскольку я никогда с SQLite не работал (только с "большими" SQL по типу MSSQL), то не знаю, какие подводные камни можно ожидать от такого подхода. Какая гарантия, что
Код: sql
1.
 SELECT changes() AS change FROM Contact WHERE change <> 0 

вернет мне правильное значение после неудачного апдейта?
Режим работы с базой у меня конечно однопользовательский, то есть коннект к базе будет один, но выполнение инструкций на инсерт и апдейт будут идти через критические секции, то есть гарантированно никто из другого потока в приложении не сможет вклиниться. Кроме того я хочу все это дело еще и транзакцией охватить. Какие будут соображения?
...
Рейтинг: 0 / 0
27.03.2014, 19:38
    #38598458
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенность SQLite синтаксиса
harismaВ обычном SQL есть такой синтаксис:Это не "обычный SQL", это конкретно Transact SQL. Будет работать только в Sybase SQL и его потомках (ASE и MS SQL). Так же будет работать в кузенах (SA и IQ) если весь пакет также будет идти в T-SQL стиле.
В остальных базах твой пример работать не будет.

harismaВ SQLite такая конструкция не работает. А какая работает?
http://sqlite.org/lang_conflict.html
Код: sql
1.
insert or replace (pk, f1, f2) values ('a', 'b', 'c')
...
Рейтинг: 0 / 0
27.03.2014, 19:49
    #38598466
fd00ch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенность SQLite синтаксиса
harismaНе понятно только как получить значение affected row count? http://sqlite.org/c3ref/changes.html
...
Рейтинг: 0 / 0
27.03.2014, 19:50
    #38598467
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Особенность SQLite синтаксиса
harismaPPA,

Спасибо. Эту ссылку я уже смотрел. Надо смотерть не ссылки а документацию. Она доступна, точна и легка для понимания.

harismaНе понятно только как получить значение affected row count?
http://www.sqlite.org/lang_corefunc.html#changes

harismaКакая гарантия, что
Код: sql
1.
 SELECT changes() AS change FROM Contact WHERE change <> 0 

вернет мне правильное значение после неудачного апдейта?гарантия 100%. Правильное значение будет всегда.

Если ты что-то запросил у базы - она тебе именно это и вернет. А вот запросил ли ты именно то что хотел или "как обычно", это уже будет на твоей совести.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Особенность SQLite синтаксиса / 6 сообщений из 6, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]