Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Проблема с sqLite
 
 автор: Андрей801   (20.01.2009 в 12:04)   письмо автору
 
 

Здравствуйте. Пытаюсь использовать SQLite и мне надо сделать такую штуку:
если запись в таблице есть, обновить, если нет то вставить.

Код
[code]
INSERT INTO GOODS
VALUES ('0', '1', 'insertsqlgoodsname', '100.10', 'insertFirm')
ON DUPLICATE KEY UPDATE
quantity = '0',
goods_name = 'UpdateSqlGoods',
price = '100.10',
goods_firm = 'UPDATE'
[/]
что работает в MySQL но не работает SQLIte. Подскажите пожалуйста, что делать?

  Ответить  
 
 автор: Саня   (20.01.2009 в 13:43)   письмо автору
 
   для: Андрей801   (20.01.2009 в 12:04)
 

SQLite не поддерживает стандарт в полной мере. На то он и Lite. Выход: сначала сделать выборку SELECT по ключу. Если выборка пустая, то INSERT, иначе UPDATE.

  Ответить  
 
 автор: Trianon   (20.01.2009 в 13:58)   письмо автору
 
   для: Саня   (20.01.2009 в 13:43)
 

не говоря уже о том, что ON DUPLICATE KEY UPDATE выходит за рамки стандарта, imho.

  Ответить  
 
 автор: Андрей801   (20.01.2009 в 14:48)   письмо автору
 
   для: Саня   (20.01.2009 в 13:43)
 

Спасибо. Не подскажешь подробнее, как проверить не пустая ли выборка на серверной стороне?
Мне нужно что то вроде

IF NOT EXISTS (SELECT * FROM GOODS WHERE goods_id = 0)  
INSERT INTO 
    GOODS 
VALUES ('0','1','insertsqlgoodsname','100.10','insertFirm')
ELSE 
UPDATE GOODS SET quantity = '0', goods_name = 'UpdateSqlGoods', price = '80.25', goods_frim = 'UPDATE' WHERE goods_id = '0'

но ругается на IF. Можно как то сделать проверку на пустой/непустой SELECT на серверной стороне?

( Я знаю, что SQLITE это встроеный сервер, сейчас объясню подробнее в чём дело.)
дело в том что вообще-то мне надо надо по учёбе писать клиент серверное приложение , где сервер должен быть MS SQL Server. Но так как на работе MS SQL SERER поставить не могу, пишу в свободное от работы время под SQL Lite, с рассчётом сменить потом драйвер QSQLITE на QODBC (сама прога на С++ с иcпользованием библиотеки QT).

  Ответить  
 
 автор: Саня   (20.01.2009 в 16:42)   письмо автору
 
   для: Андрей801   (20.01.2009 в 14:48)
 

SQLite не поддерживает оператор IF. Лучше следуйте примерно такой логике:
result = sqlite_query(handler, "SELECT COUNT(*) FROM GOODS WHERE goods_id = 0");
fetch = sqlite_fetch(result);
if ( (int) fetch[0] > 0 ) {
  sqlite_query(handler, "UPDATE...");
} else {
  sqlite_query(handler, "INSERT...");
}
// PS это не си

  Ответить  
 
 автор: Андрей801   (21.01.2009 в 10:13)   письмо автору
 
   для: Саня   (20.01.2009 в 16:42)
 

Спасибо ещё раз! То есть мне в неизбежно придётся проверить результат запроса SELECT на клиентской стороне? В принципе, ничего страшного, но придётся повозится при окончательной доводкой приложения под MS SQL SERVER.

  Ответить  
 
 автор: Саня   (21.01.2009 в 10:32)   письмо автору
 
   для: Андрей801   (21.01.2009 в 10:13)
 

Вы можете написать программу-прокладку, которая будет выполняться на сервере с СУБД. И передавать такие вот специальные запросы через неё.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования