Это, вероятно, означает, что ваш оператор вставки нарушает ограничение в новой таблице.Может быть ограничение первичного ключа, ограничение уникальности, ограничение внешнего ключа (если вы используете PRAGMA foreign_keys = ON;
) и т. Д.
Это можно исправить, удалив ограничение, исправив данные илисбросив данные.Отбрасывание ограничения, как правило, плохо, но это зависит от приложения.
Есть ли веская причина копировать данные по одной строке за раз вместо набора?
INSERT INTO new_table
SELECT column_list FROM old_table;
Если вам нужна помощь в определении ограничения, отредактируйте исходный вопрос и опубликуйте результаты этих двух запросов SQLite.
select sql from sqlite_master where tbl_name = 'old_table_name';
select sql from sqlite_master where tbl_name = 'new_table_name';
Обновление: На основе результатов этих двухзапросы, я вижу только одно ограничение - ограничение первичного ключа в каждой таблице.Если вы не создали никаких триггеров для этих таблиц, единственным ограничением, которое может дать сбой, является ограничение первичного ключа.И единственный способ, которым ограничение может потерпеть неудачу, - это если вы попытаетесь вставить две строки, которые имеют одинаковое значение для 'pk'.
Я полагаю, это может произойти несколькими различными способами.
- В старой таблице есть повторяющиеся значения в столбце 'pk'.
- Код, который выполняет миграцию, изменяет или вводит повторяющееся значение перед вставкой данных в новую таблицу.
- Другой процесс,возможно, работает на другом компьютере, вставляет или обновляет данные без вашего ведома.
- Другие причины, о которых я пока не задумывался.: -)
Вы можете определить, есть ли в старой таблице повторяющиеся значения 'pk', выполнив этот запрос.
select pk
from old_table_name
group by pk
having count() > 1;
Возможно, вы попытаетесь вручную перенестииспользование данных INSERT INTO . . . SELECT . . .
Если это не удается, добавьте предложение WHERE, чтобы уменьшить размер набора, пока вы не изолируете неверные данные.