| 
    
        
     
     | 
    
  | 
v7: Как одним запросом вставить несколько строк в таблицу SQlite | ☑ | ||
|---|---|---|---|---|
| 
    0
    
        FobusVGrunt    
     06.06.16 
            ✎
    16:15 
 | 
         
        Нужно добавлять строки в таблицу, метод УложитьТЗ не катит, он удаляет таблицу перед добавлением. делать в цикле по одной строке "INSERT", очень медленно. Пробовал "INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1,2),(100,200),....". Выдает ошибку на синтаксис ",". Как в SQLite одним запросом можно добавить много строк?     
         | 
|||
| 
    1
    
        Волшебник    
     модератор 
    06.06.16 
            ✎
    16:17 
 | 
         
        SQLite не умеет вставлять несколько строк     
         | 
|||
| 
    2
    
        Sserj    
     06.06.16 
            ✎
    16:19 
 | 
         
        http://www.sqlite.org/lang_insert.html
 
        выдает правильную ошибку, скорей всего лишняя запятая после последних скобок валуесов.  | 
|||
| 
    3
    
        FobusVGrunt    
     06.06.16 
            ✎
    16:21 
 | 
         
        (1) В 1С-ке, выдает ошибку, а через SQLiteExpert, без вопросов работает     
         | 
|||
| 
    4
    
        FobusVGrunt    
     06.06.16 
            ✎
    16:25 
 | 
         
        "INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1,2),(100,200)" - в SQLiteExpert добавляет две строки, через 1С, точно такой запрос пишет:  <near ",": syntax error>     
         | 
|||
| 
    5
    
        youalex    
     06.06.16 
            ✎
    16:32 
 | 
         
        (0) 
 
        insert into [test] ([f1]) select 1 union select 2;  | 
|||
| 
    6
    
        Chieftain    
     06.06.16 
            ✎
    16:33 
 | 
         
        (0) УложитьТЗ + Insert Into Select From     
         | 
|||
| 
    7
    
        FobusVGrunt    
     06.06.16 
            ✎
    16:35 
 | 
         
        (5) Спасибо, так уже попробовал работает с 1С, но интересно чего один и тот же запрос в одной программе работает, а во второй нет     
         | 
|||
| 
    8
    
        FobusVGrunt    
     06.06.16 
            ✎
    16:37 
 | 
         
        (6) имеется ввиду уложить во временную, а потом от туда в основную?     
         | 
|||
| 
    9
    
        Chieftain    
     06.06.16 
            ✎
    16:39 
 | 
         
        (8) да, как вариант     
         | 
|||
| 
    10
    
        FobusVGrunt    
     06.06.16 
            ✎
    16:55 
 | 
         
        походу остается только как в (6), в (5) - есть ограничения походу на кол-во SELECT в запросе, так если много записей выдает ошибку (too many terms in compound  SELECT)     
         | 
|||
| 
    11
    
        Chieftain    
     06.06.16 
            ✎
    17:02 
 | 
         
        (10) Можно разбить по 500 записей))     
         | 
|||
| 
    12
    
        FobusVGrunt    
     06.06.16 
            ✎
    17:16 
 | 
         
        (11) Неее оптимально в (6). Скинул во временную таблицу, если транзакция успешная скопировал в основную.     
         | 
|||
| 
    13
    
        Djelf    
     06.06.16 
            ✎
    17:38 
 | 
         
        (0) Движок sqlite в 1sqlite 1.0.2.6 - 3.7.10, а поддержка вставки нескольких строк была добавлена в движке 3.7.11     
         | 
|||
| 
    14
    
        trdm    
     06.06.16 
            ✎
    17:59 
 | 
         
        BEGIN;
 
        INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1),(100); INSERT INTO a_L_S47 (IDOLD,ID) VALUES (2),(200); COMMIT;  | 
|||
| 
    15
    
        trdm    
     06.06.16 
            ✎
    18:04 
 | 
         
        Query succeeded:
 
        create table a_L_S47 (IDOLD int ,ID int) Query succeeded: BEGIN; INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1),(100); INSERT INTO a_L_S47 (IDOLD,ID) VALUES (2),(200); COMMIT; -- Нормально пашет.  | 
|||
| 
    16
    
        FobusVGrunt    
     06.06.16 
            ✎
    22:24 
 | 
         
        (15) по синтаксису значения в одних скобках должны быть не "VALUES (1),(100)", а "VALUES (1,100)"     
         | 
|||
| 
    17
    
        FobusVGrunt    
     06.06.16 
            ✎
    22:25 
 | 
         
        (15) и у меня что-то не пашет, эта конструкция     
         | 
|||
| 
    18
    
        FobusVGrunt    
     06.06.16 
            ✎
    22:25 
 | 
         
        (13) Спасибо, теперь понятно почему в 1С  не работает такая конструкция     
         | 
|||
| 
    19
    
        Djelf    
     06.06.16 
            ✎
    23:38 
 | 
         
        (12) Решение правильное. Самый быстрый способ! 
 
        Хинт - разбивать на порции ~10000 строк (подбирать в зависимости от объема 1й строки). Тогда можно и вывести какой то прогрессбарчик и работает быстрее.  | 
|||
| 
    20
    
        trdm    
     07.06.16 
            ✎
    07:53 
 | 
         
        (17) Да, не пашет.
 
        пользовался приблудой типа QA - она по синтаксису прошла, но дело не сделала.  | 
|||
| 
    21
    
        trdm    
     07.06.16 
            ✎
    07:56 
 | 
         
        да и конструкция
 
        BEGIN; INSERT INTO a_L_S47 (IDOLD,ID) VALUES (1,100); INSERT INTO a_L_S47 (IDOLD,ID) VALUES (2,200); COMMIT; вставляет 1 строку через QA. Хрень какая-то..  | 
|||
| 
    22
    
        FobusVGrunt    
     07.06.16 
            ✎
    13:41 
 | 
         
        (21) Что такое QA ?     
         | 
|||
| 
    23
    
        Ёпрст    
     гуру 
    07.06.16 
            ✎
    14:01 
 | 
         
        (22) квери анализёр     
         | 
|||
| 
    24
    
        Djelf    
     07.06.16 
            ✎
    23:26 
 | 
         
        (21) Да, есть такое! Обрабатывается только первый запрос перед ';'
 
        Мастер чуток недокурил интерфейс. sqlite3_prepare_v2 надо запускать в цикле т.к. он кушает только 1 запрос за проход. Ну а поскольку мне это не нравится то 
Фиксед! 1sqlite 3.8.11.bf8 https://cloud.mail.ru/public/86LY/qr1G1waT5 Расшифровка explain для 2х запросов подряд не работает. Буду думать.  | 
|||
| 
    25
    
        Chieftain    
     08.06.16 
            ✎
    00:20 
 | 
         
        (24) чую со ссылочкой ты ошибся, по теме Tool_1CD вообще никаким боком     
         | 
|||
| 
    26
    
        Djelf    
     08.06.16 
            ✎
    01:21 
 | 
         
        (25) А при чем тут вообще Tool_1CD? оО 
 
        Это относится к 1sqlite. Было в (21) удивление про хрень. Хрень была изучена и частично излечена. Не попал ответом в заголовок темы, но попал в ответвление от вопроса. Что не так?  | 
|||
| 
    27
    
        Chieftain    
     08.06.16 
            ✎
    02:31 
 | 
         
        (26) Из твоего поста следует, что ты изучил проблему, нашел ей решение. Есть смысл полагать, что ты качнул с репа исходники, поправил и собрал. Написал "Фиксед!1sqlite 3.8.11.bf8" и указал ссылку. Но ссылка твоя ведет почему-то на скачивание "Tool_1CD.zip".
 
        Так что все так!  | 
|||
| 
    28
    
        Djelf    
     08.06.16 
            ✎
    02:45 
 | 
         
        Ой... Спасибо! 
 
        Ну так бы сразу и написал, а то я голову ломаю... дабл фиксед ;) https://cloud.mail.ru/public/9AU9/arRAT8Xx6 P.S. после последней ';' ни пробелов ни комментариев быть не должно. Заметил только сейчас, возможно завтра доделаю, чтобы не влияло.  | 
|||
| 
    29
    
        trdm    
     08.06.16 
            ✎
    12:58 
 | 
         
        (24) Я пользуюсь чуток доработанным примером QA из этой книжки: 
 
        https://www.ozon.ru/context/detail/id/4030253/ https://yadi.sk/d/vikpGmjzsLnuw  | 
|||
| 
    30
    
        Djelf    
     08.06.16 
            ✎
    15:24 
 | 
         
        (29) А я подумал QA в 1с`ке.
 
        Эх... рано радовался. В варианте (24) выполняется только последний запрос. Надо рисовать хранение и обработку всей цепочки подготовленных запросов. Это займет какое то время.  | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |