Исправлено в версии 3.5.4 (2007-12-14):
Любая операция DELETE или UPDATE, которая использует побочные эффекты для удаления дополнительных строк в той же таблице, которая является предметом DELETE или UPDATE, может привести к повреждению базы данных. Впервые проблема была выявлена в билете № 2832. Но проблема очень старая и затрагивает все версии SQLite по крайней мере до версии 3.3.13 (самая ранняя версия, которую мы проверили).
«Побочный эффект удаления» в предыдущем абзаце означает удаление, которое происходит в результате предложения OR REPLACE или в результате триггера. Например:
CREATE TABLE ex1(a INTEGER PRIMARY KEY, b);
INSERT INTO ex1 VALUES(1,2);
INSERT INTO ex1 VALUES(2,3);
CREATE TRIGGER ex1_tr1 AFTER UPDATE ON ex1 BEGIN
DELETE FROM ex1 WHERE a=old.b;
END;
UPDATE ex1 SET b=b+1;
В приведенном выше примере первый цикл UPDATE вызывает срабатывание триггера и удаление второй строки таблицы ex1. Когда выполняется второй цикл цикла UPDATE, он пытается обработать вторую строку таблицы ex1. SQLite распознал, что вторая строка была удалена, поэтому он прерывает второй цикл, но не может правильно очистить после себя, что может привести к повреждению базы данных на последующих циклах цикла.