Поскольку проверка на наличие дубликатов не обнаруживает проблем. Возможно получение значений во время проблемы может помочь. Есть ли у вас триггеры случайно? Иногда они распространяют ошибку, которая будет сообщаться как о таблице, которая сработала триггер.
В связи с этим, возможно, стоит добавить таблицу для регистрации таких данных вместе с BIGORE UPDATE TRIGGER, чтобы фактически записывать информацию во время выполнения. Чтобы остановить откат данных и, таким образом, отменить зарегистрированную информацию ИЛИ СБОЙ, необходимо использовать.
Важно, поскольку обновления не будут отменены. Обновления будут применены. Предполагается, что вышеуказанное используется в тестовой базе данных.
-- The code
DROP TABLE IF EXISTS lastupdated;
-- Create the logging table
CREATE TABLE IF NOT EXISTS lastupdated (counter, lastfile_before, lastfile_after, id_of_the_row);
-- Initialise it so it's plain to see if nothing has been done
INSERT INTO lastupdated VALUES(0,'nothing','nothing',0);
-- Add the Trigger to record the debugging information BEFORE the update
CREATE TRIGGER IF NOT EXISTS monitorupdateprogress
BEFORE UPDATE ON MGOFile
BEGIN
UPDATE lastupdated SET counter = counter +1, lastfile_before = old.File, lastfile_after = new.File, id_of_the_row = old.rowid;
END
;
UPDATE OR FAIL MGOFile -- OR FAIL will halt but NOT ROLLBACK
SET File = 'T:\' || substr(File, 8, 2000)
WHERE File like 'M:\_TV%';
SELECT * FROM lastupdated; -- will not run if there is a fail but should be run after the fail
Это, при условии отказа, записать
- n-е обновление в счетчике столбец
- значение в столбце Файл до изменения в столбце lastfile_before .
- значение, до которого будет обновлен столбец File в столбцах ** lastfile_after *.
- последний идентификатор строки (с ошибкой) строки в таблице MGOFile (предполагается, что таблица MGOFile не является таблицей, определенной с использованием
WITHOUT ROWID
).
- Если таблица была определена без ROWID, вы можете изменить
, id_of_the_row = 0;
. Значение тогда будет бессмысленным.
Тестирование / Результаты Версия выше, которая использовалась для проверки выше: -
-- Solely for testing the code below
DROP TABLE IF EXISTS MGOFile;
CREATE TABLE IF NOT EXISTS MGOFile (File TEXT PRIMARY KEY);
-- Some testing data
INSERT INTO MGOFile VALUES
('M:\_TV/9-1-1.so2e09.web.x264-tbs[eztv].mkv'),
('M:\_TV/9-1-1.so2e09.web.x265-tbs[eztv].mkv'),
('M:\_TV/9-1-1.so2e09.web.x266-tbs[eztv].mkv'),
('M:\_TV/9-1-1.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv'),
('M:\_TV/9-1-1.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x277-tbs[eztv].mkv'),
('M:\_TV/9-1-1.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x278-tbs[eztv].mkv'),
('M:\_TV/9-1-1.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x279-tbs[eztv].mkv'),
('M:\_TV/9-1-1.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x266-tbs[eztv].mkv.so2e09.web.x280-tbs[eztv].mkv')
;
SELECT substr(File,170,8) FROM MGOFile GROUP BY Substr(File,8,170) HAVING count() > 1;
-- The code
DROP TABLE IF EXISTS lastupdated;
-- Create the logging table
CREATE TABLE IF NOT EXISTS lastupdated (counter, lastfile_before, lastfile_after, id_of_the_row);
-- Initialise it so it's plain to see if nothing has been done
INSERT INTO lastupdated VALUES(0,'nothing','nothing',0);
-- Add the Trigger to record the debugging information BEFORE the update
CREATE TRIGGER IF NOT EXISTS monitorupdateprogress
BEFORE UPDATE ON MGOFile
BEGIN
UPDATE lastupdated SET counter = counter +1, lastfile_before = old.File, lastfile_after = new.File, id_of_the_row = old.rowid;
END
;
SELECT * FROM MGOFile;
UPDATE OR FAIL MGOFile -- OR FAIL will halt but NOT ROLLBACK
SET File = 'T:\' || substr(File, 8, 170) -- <<<<<<<<<<<<<<<<<<<< truncate reduced to force UNIQUE constraint
WHERE File like 'M:\_TV%';
SELECT * FROM lastupdated; -- will not run if there is a fail
При выполнении вышеизложенного появляется сообщение: -
UPDATE OR FAIL MGOFile -- OR FAIL will halt but NOT ROLLBACK
SET File = 'T:\' || substr(File, 8, 170) -- <<<<<<<<<<<<<<<<<<<< truncate reduced to force UNIQUE constraint
WHERE File like 'M:\_TV%'
> UNIQUE constraint failed: MGOFile.File
> Time: 0.094s
Запуск SELECT * FROM lastupdated;
возвращает: -
счетчик
lastfile_before =
- M: _TV / 9-1-1.so2e09.web.x266-ТБС [EZTV] .mkv.so2e09.web.x266-TBS [EZTV] .mkv.so2e09.web.x266-ТБС [ EZTV] .mkv.so2e09.web.x266-ТБС [EZTV] .mkv.so2e09.web.x266-TBS [EZTV] .mkv.so2e09.web.x278-TBS [EZTV] .mkv
lastfile_after
- T: \ 9-1-1.so2e09.web.x266-ТБС [EZTV] .mkv.so2e09.web.x266-TBS [EZTV] .mkv.so2e09.web.x266-ТБС [EZTV ] .mkv.so2e09.web.x266-tbs [eztv] .mkv.so2e09.web.x266-tbs [eztv] .mkv.so2e09.web.x27
id_of_the_row
В приведенном выше надуманном примере проблему можно легко определить (хотя при повторном поиске также обнаружена та же проблема), так как ошибка находится в 6-й строке и в строке, содержащей mkv.so2e09.web.x278-tbs[eztv]
, но была усечена обновлением до .mkv.so2e09.web.x27
, следовательно, это дубликат 5-й строки, который имеет .mkv.so2e09.web.x277-tbs[eztv]
, но также был усечен до .mkv.so2e09.web.x27
.
P.S. Вы пытались использовать только
UPDATE MGOFile
SET File = 'T:\' || substr(File, 8)
WHERE File like 'M:\_TV%';
т.е. удаление усечения.