С Новым годом! Форум программистов, компьютерный форум, киберфорум
SQLite
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527

SQLIte странное поведение при вставке

16.03.2018, 02:23. Показов 2156. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Использую SQLIte, вместе с C#, и понадобилось мне в один прекрасный момент объеденить несколько баз данных, которые накопили приложения. Вопрос - фигня. Накатал программу, бд сложил в одну папку, программа отработала, и, всё бы ок, вот только появился странный косяк. При добавлении данных из разных баз в одну, я использовал команду "INSERT OR IGNORE INTO ...", которая, по идее должна была вставлять строки только в том случае, если их не было ранее. Вот только, в результате, я получил ~5,5 тысяч дублирующихся строк! Единственное, на что я сейчас грешу - я в каждом INCERT-е добавлял за раз по 1000 значений. Подскажите пожалуйста, в чём могла быть проблема, из-за которой такое произошло?

Добавлено через 10 минут
Update: сейчас проверил - в базах, которые были сделаны программами тоже куча дублей =_=. Там использовался тот же самый "INSERT OR IGNORE INTO 'table' ('a', 'b', 'c', 'd', 'e', 'f', 'g') VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}'), ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}', '{6}') ..." и так далее, с тысячей строк...

Добавлено через 2 часа 27 минут
Update2: Да, с вероятностью в много процентов (первый тест прошёл, если вся база очистится от дублей, посредством программы, то вероятность будет в 100%), причиной косяка было именно использование множества строк с параметрами.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.03.2018, 02:23
Ответы с готовыми решениями:

SQLite 3. Странное поведение субд на стареньком компьютере
Разрабатываю СУБД для кафедры БЖЧ. У них стоят старые компьютеры с Windiws xp 2002. Моя субд работает на моём компьютере. При первой...

Странное поведение sqlite - database is locked в 50% случаев
Выполняется обычный запрос: "UPDATE results SET isReaded = @isread WHERE id = @id;". Когда я просто хочу это сделать, вылетает database is...

Как сделать наиболее точные замеры производительности SQLite при вставке данных
Всем доброго времени суток! Я только-только начинаю осваивать базы данных, выбор пал на System.Data.SQLite. Уже сейчас очень хотелось...

10
5957 / 4533 / 1094
Регистрация: 29.08.2013
Сообщений: 28,131
Записей в блоге: 3
16.03.2018, 07:26
https://stackoverflow.com/ques... re-to-work
посмотри тут
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
16.03.2018, 07:45  [ТС]
qwertehok, У меня есть идентификатор в таблице, который является "Primary Key". Более того, Само дублирование работает очень странно. Из 4 миллионов записей, набранных 4 программами, за разные периоды, получилось всего 1,6 миллиона записей (т.е. большинство вставок, с игнорированием выполнялось корректно), но, при этом, всё равно оказалось около 5,5 тысяч записей, которые дублировали другие (при этом, если у записи был дубль, тто только один).
0
5957 / 4533 / 1094
Регистрация: 29.08.2013
Сообщений: 28,131
Записей в блоге: 3
16.03.2018, 07:48
если у тебя всего 4 ляма записей почему не сделать подзапрос и не вставить только тех что нет?

зачем вставлять все подряд и ждать что субд сама отбросит дубли?
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
16.03.2018, 09:01  [ТС]
qwertehok, 4 ляма записей в 4 файлах бд. Там просто протупили изначально, в итоге решили всё на сервер переносить, в итоге, нужно было собрать все полученные до этого данные воедино.

Добавлено через 1 час 10 минут
Да, теперь могу сказать совершенно точно - косяк возникал из-за конструкции:
SQL
1
2
3
INSERT OR IGNORE INTO 'table' ('a', 'b', 'c', 'd', 'e', 'f', 'g') VALUES 
('0', '1', '2', '3', '4', '5', '6'), 
('0', '1', '2', '3', '4', '5', '6'), ...
В результате выполнения которой, он периодически пропускал строки, которые вставлять было не надо.
Переход на несколько (в одной транзакции):
SQL
1
INSERT OR IGNORE INTO 'table' ('a', 'b', 'c', 'd', 'e', 'f', 'g') VALUES  ('0', '1', '2', '3', '4', '5', '6');
Полностью исправил проблему.
0
5957 / 4533 / 1094
Регистрация: 29.08.2013
Сообщений: 28,131
Записей в блоге: 3
16.03.2018, 10:10
опять спрошу
почему было не вставить все во временную таблицу, а потом выбрать только тех что нет и вставить их?
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
16.03.2018, 18:00  [ТС]
qwertehok, ну, в программе, которая объединяла БД, я так и сделал. Вот только, в рабочую программу у меня данные поступают пачками, по 1000 строк, среди которых - повторяющиеся, раз в 30 секунд. Вы предлагаете и в ней убрать "INCERT OR IGNORE", чтобы делать по 2 запроса, для каждой из поступивших строк? Или же, мне нужно будет выгружать все записи в память, затем сравнивать с поступившими, на предмет дублей, и только потом писать в бд? Тогда на кой она вообще будет нужна?

Добавлено через 41 минуту
UPD. Спросоня криво прочитал, сорри. Но опять же, что за наркомания вообще? Т.е. вы предлагаете 1000 записей, втыкать во временную таблицу, запрашивать оттуда уникальные, затем, вставлять их в основную таблицу, и удалять из временной?
0
5957 / 4533 / 1094
Регистрация: 29.08.2013
Сообщений: 28,131
Записей в блоге: 3
16.03.2018, 18:12
Цитата Сообщение от Захарка Посмотреть сообщение
Т.е. вы предлагаете 1000 записей, втыкать во временную таблицу, запрашивать оттуда уникальные, затем, вставлять их в основную таблицу, и удалять из временной?
да

Цитата Сообщение от Захарка Посмотреть сообщение
Но опять же, что за наркомания вообще?
у меня?
а у вас? пихать 1000 строк в таблицу и ждать пока система проверит все
это тоже самое, только в моем варианте всем управляете вы
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
16.03.2018, 18:55  [ТС]
qwertehok, вот только мой вариант ПРАВИЛЬНЫЙ, с точки зрения логики. Если СУБД поддерживает возможность игнорирования при вставке, то по какой причине (кроме того, что это реализовано через жопу) я не должен пользоваться этой возможностью, а навешивать дополнительный лишний код, который будет выполнять ту же самую функцию?
0
5957 / 4533 / 1094
Регистрация: 29.08.2013
Сообщений: 28,131
Записей в блоге: 3
17.03.2018, 07:01
во первых реализовано это нормально если инструкции прочитать и тесты провести, а не как ты сразу бахнул и уже потом ВДРУГ ошибки

во вторых логика у каждого разная)
0
135 / 130 / 60
Регистрация: 16.06.2013
Сообщений: 527
17.03.2018, 07:43  [ТС]
qwertehok, честно говоря, я просто решил не изобретать велосипед, когда под рукой было готовое стандартное решение. Честно говоря, опыт работы с бд у меня не особо обширный - до этого дело имел только с мускулем, для PHP-шных сайтов, а тут понадобилось в программе работать с большим массивом данных, вот и выбрал встраиваемую БД (сервер изначально даже не предполагался). А в итоге, у меня сейчас дико странная вещь, от которой у меня скоро нервный тик начнётся. Суть в чём - та программа, которую я сделал для объединения бд, отрабатывает верно - дубли не создаются. Но, как только я файл БД перекидываю в основную программу, и запускаю - начинают появляться дубли. И, основная заковыка в том, что класс, который содержит всю работу с БД и там и там идентичен! Просто в "объеденителе" сначала идёт считывание всей бд в память, в кастомный тип данных, а в основной программе - эти данные поступают уже в ходе работы. Сохранение идёт полностью одинаково. Вот только, в одном случае дубли появляются, а в другом - нет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.03.2018, 07:43
Помогаю со студенческими работами здесь

Странное поведение при буте
помогите разобраться. комп старенький достаточно, при включение питания пишет cmos checksum error(батарейка недавно менялась, дата не...

Странное поведение при отладке
Здравствуйте. Решил написать небольшую тулзу и столкнулся с проблемой: скомпилированный код прекрасно работает в отладчике, однако не...

Странное поведение ПК при старте
Всем привет!Во время запуска пк,кулера гаснут,изображения нету.Все это длится 1-2 секунды и происходит нормальный запуск после этого.Что...

Странное поведение при делегировании
Доброй ночи, Господа. Пишу некую доп. функциональность к календарю, но дело, собственно, не в этом. Прописываю 2 события. Т.к....

Странное поведение при загрузке
Доброго времени суток! Ситуация такая,Имеется материнка ASUS P8P67 rev. B3 четыре планки памяти две Kingston 2xKHX1600C9D3/2GX и Kingston...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru