Обновление первых 7 символов строки другими 3 символами с использованием SQL выдает «Ошибка 19 - Сбой уникального ограничения: MGOFile.File». - PullRequest
1 голос
/ 30 мая 2019

У меня довольно простая БД со столбцом под названием «Файл», и мне нужно удалить первые 7 символов каждой строки и заменить их новой строкой.Мне показалось, что код отсортирован, но я получаю сообщение об ошибке «Ошибка SQLite3 19 - Не удалось выполнить ограничение UNIQUE: MGOFile.File.»

Имя моей таблицы - MGOFile, а столбец - «Файл».Это простой оператор выбора в первых нескольких строках, левый столбец - необработанные данные, правый - то, что мне нужно, чтобы результирующие строки выглядели как ... A Screenshot of my data

Я запрашиваю свою таблицу, используя эту:

    '''sql
    SELECT 
      File, 
      'T:\'|| substr(File, 8,2000) as File 
    FROM 
      MGOFile
    WHERE 
      file like 'M:\_TV%';
    '''

Затем я попытался обновить, используя это:

    UPDATE MGOFile
    SET File = 'T:\' || substr(File, 8, 2000)
    WHERE File like 'M:\_TV%';

Но здесь, где моя ошибка приходит, это терпит неудачу с ошибкой: SQLite3 Error 19 - UNIQUE constraint failed

Я уверен, что делаю что-то простое неправильно, но я сделал много Googling, но все ответы у меня над головой, это самый продвинутый SQL, который я пытался сделать!

Любые идеи о том, как можно обновитьэти строки с каким-то простым SQLite?

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Поскольку проверка на наличие дубликатов не обнаруживает проблем. Возможно получение значений во время проблемы может помочь. Есть ли у вас триггеры случайно? Иногда они распространяют ошибку, которая будет сообщаться как о таблице, которая сработала триггер.

В связи с этим, возможно, стоит добавить таблицу для регистрации таких данных вместе с 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; возвращает: -

  • счетчик

    • 6
  • 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

В приведенном выше надуманном примере проблему можно легко определить (хотя при повторном поиске также обнаружена та же проблема), так как ошибка находится в 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%';

т.е. удаление усечения.

1 голос
/ 30 мая 2019

Ошибка кажется мне вполне понятной.Вы меняете имя файла на имя, которое уже есть в таблице.

Вы можете идентифицировать дубликаты, выполнив:

SELECT f.*
FROM MGOFile f
WHERE EXISTS (SELECT 1
              FROM MGOFile f2
              WHERE f2.File = 'T:\'|| substr(File, 8,2000)
             ) AND
      f.file LIKE 'M:\_TV%';

Я не знаю, что вы хотите сделать сдубликат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...