вставка записей в SQLite

Афанасий Узда
Дата: 08.05.2011 16:52:51
Немного ламерский вопрос, но ответа так и не накопал в гугле:
Почему не получается в одном запросе сделать сразу две вставки (поля id, num. id - автоинкрементное)??:
INSERT INTO main(num) VALUES (100);
INSERT INTO main(num) VALUES (101);
В этом случае вставляет только первую запись.

а так ваще не ничего не вставляет:
BEGIN;
INSERT INTO main(num) VALUES (100);
INSERT INTO main(num) VALUES (101);
COMMIT; 
зы: использую UniDAC + Delphi XE
wellwell
Дата: 08.05.2011 17:44:34
; конец команды. Исполняй построчно.
Dmitry Arefiev
Дата: 08.05.2011 17:52:56
Не судьба с UniDAC - не поддерживает он, видать, SQLite батчи ...
Афанасий Узда
Дата: 08.05.2011 17:56:03
wellwell,

Построчно долго.. мне надо из памяти слить в базу несколько десятков тысяч записей за минимальное время..
Этим товарищам же как-то удается [url=]http://www.sqlite.org/cvstrac/wiki?p=SpeedComparison[/url]
INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three');
INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty');
... 995 lines omitted
INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine');
INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two');
INSERT INTO t1 VALUES(1000,94142,'ninety four thousand one hundred forty two');
и ";" им вроде не мешает в конце каждой строки
Афанасий Узда
Дата: 08.05.2011 17:58:14
Dmitry Arefiev,

если использовать SQLite Database Browser то там тоже выполняя аналогичные запросы та же фигня что и из кода под delphi
Dmitry Arefiev
Дата: 08.05.2011 18:12:27
1) Если надо заливать много записей в SQLite из Delphi кода, то надо использовать prepared
INSERT запрос и обрамить все в транзакцию:
Connection.StartTransaction;
try
  Query.SQL.Text := 'INSERT INTO tab VALUES (:p1, ..., :pN)';
  for i := 1 to 10000 do begin
    Query.Params[0].AsXxx := ...;
    .....
    Query.Params[N-1].AsXxx := ...;
    Query.ExecSQL;
  end;
  Connection.Commit;
except
  Connection.Rollback;
  raise;
end;

2) Если ты одни работаешь с БД, то неплохо выставить и некоторые прагмы - существенно
ускорит заливку в БД.

3) ';' - это разделитель команд в SQLite батчах. Судя по всему UniDAC не поддерживает
SQLite батчи, потому и ничего не вставляется. Другие библиотеки с более качественной
реализацией поддержки SQLite поддерживают его батчи. Дело в том что там в API есть
небольшая ловкость которую надо использовать чтобы поддерживать эти батчи :)
Афанасий Узда
Дата: 08.05.2011 18:44:34
Dmitry Arefiev,

Спасибо, примерно понял че к чему, но что значит кусок (:p1, ..., :pN)'; ?
Dmitry Arefiev
Дата: 08.05.2011 18:56:21
Значения передаются не константами, а через параметры. Один параметр на одну колонку.
Формат параметра :<имя>. Для упрощения я именовал пар-ры :p1 и т.д. до :pN.
Афанасий Узда
Дата: 08.05.2011 19:13:04
Dmitry Arefiev,

Супер, огромное спасибо.. 100 тыщ записай сливаются секунды за 4. Мега респект.