SQL запрос в SQLite

 

Привет!

Есть база данных SQLite

Как составить запрос, чтобы приходящие данные переписывали первую строчку,  если она существует, и добавились, если ничего нет?

Т.е была бы всегда только одна строка.

FDQuery.SQL.Text:= 'insert or replace into ' + strData.sName + string(sTable.name) +  ' (' + FieldNames + ') values (' + Values +   ') where (replID <= ' + IntToStr(rID) + ')'';


При таком запросе - крэш

SQLite: нативная работа с базами данных на SQL в MQL5
SQLite: нативная работа с базами данных на SQL в MQL5
  • www.mql5.com
Разработка торговых стратегий связана с обработкой больших объемов данных. Теперь прямо в MQL5 вы можете работать с базами данных с помощью SQL-запросов на основе SQLite. Важным преимуществом данного движка является то, что вся база данных содержится в единственном файле, который находится на компьютере пользователя.
 
prostotrader:

Привет!

Есть база данных SQLite

Как составить запрос, чтобы приходящие данные переписывали первую строчку,  если она существует, и добавились, если ничего нет?

Т.е была бы всегда только одна строка.


При таком запросе - крэш

достаточно в самой базе replID объявить как primary key , и where в запросе ненужен

 
Maxim Kuznetsov #:

достаточно в самой базе replID объявить как primary key , и where в запросе ненужен

replID - первый элемент записи, он и так  primary key, но так как вновь приходящие данные имеют разный replIDЮ то существующая запись

не заменяется, а добавляется  новая запись

То, что есть в таблице записано с помощью команды

FDQuery.SQL.Text:= 'insert or replace into ' + strData.sName + string(sTable.name) +  ' (' + FieldNames + ') values (' + Values +   ')'

Я уже все глаза проглядел, но так и не понял как составить запрос

https://www.sqlite.org/lang_update.html

 
prostotrader #:

replID - первый элемент записи, он и так  primary key, но так как вновь приходящие данные имеют разный replIDЮ то существующая запись

не заменяется, а добавляется  новая запись

То, что есть в таблице записано с помощью команды

Я уже все глаза проглядел, но так и не понял как составить запрос

https://www.sqlite.org/lang_update.html

primary key и "первый элемент записи" - это разные вещи

replID должен быть primary key или unique key тогда он идентифицирует строку и insert or update сложит всё правильно - новые добавит, существующие обновит

в схеме таблицы надо указать 

https://www.sqlite.org/lang_createtable.html

 
По-моему, вы друг друга не понимаете. :)

Надо в таблице добавить поле, которое должно быть первичным ключом. Но это не replID, т.к. мы видим, что replID содержит какую-то информацию, а запись должна быть одна.
Так вот, добавив поле первичного ключа, надо всегда при инсерте/апдейте заносить в него одно и тоже значение, тогда и записи плодиться не будут.
 
prostotrader #:
replID - первый элемент записи, он и так  primary key,

Номер столбца никак не связан первичным ключом. Ключ всегда должен быть объявлен. Неявный ключ - ROWID, но он создаётся автоматически.
 
Sergey Gridnev #:
По-моему, вы друг друга не понимаете. :)

Надо в таблице добавить поле, которое должно быть первичным ключом. Но это не replID, т.к. мы видим, что replID содержит какую-то информацию, а запись должна быть одна.
Так вот, добавив поле первичного ключа, надо всегда при инсерте/апдейте заносить в него одно и тоже значение, тогда и записи плодиться не будут.

если ReplID - целое и уникально by design то оно и должно быть primary key

 
Maxim Kuznetsov #:

если ReplID - целое и уникально by design то оно и должно быть primary key

Как я понял, у него в таблице ВСЕГДА должна быть 1 запись.
 
Sergey Gridnev #:
Как я понял, у него в таблице ВСЕГДА должна быть 1 запись.

да, правильно

 

Так как составить зарос, чтобы

1. если в таблице нет записей, то запись добавилась

2. если есть запись, то она обновилась новыми данными

Т.е. запись всегда должна быть одна, но с новыми данными

 
prostotrader #:

Так как составить зарос, чтобы

1. если в таблице нет записей, то запись добавилась

2. если есть запись, то она обновилась новыми данными

Т.е. запись всегда должна быть одна, но с новыми данными

Должен быть объявлен первичный ключ, его значение ВСЕГДА должно быть одинаковое.
Причина обращения: