gpt4 book ai didi

sql - 使用 SQL 用另外 3 个字符更新字符串的前 7 个字符,抛出 "Error 19 - UNIQUE constraint failed: MGOFile.File."

转载 作者:行者123 更新时间:2023-12-03 14:59:27 28 4
gpt4 key购买 nike

我有一个相当简单的数据库,其中有一列名为 File,我需要删除每行的前 7 个字符,并用新字符串替换。我以为我已经对代码进行了排序,但我收到错误“SQLite3 错误 19 - UNIQUE 约束失败:MGOFile.File。”

我的表名是 MGOFile,列是 File。这是前几行的简单选择语句,左列是原始数据,右列是我需要的结果行看起来像......
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

我确信我做错了一些简单的事情,但我已经做了很多谷歌搜索,但所有的 react 都在我头上,这是我尝试过的最高级的 SQL!

关于如何使用一些简单的 SQLite 更新这些字符串的任何想法?

最佳答案

由于检查重复项似乎无法检测到问题。也许在问题发生时获得值(value)可能会有所帮助。你有任何机会触发吗?这些有时会传播一个错误,该错误将与触发触发器的表一起报告。

因此,可能考虑添加一个表来记录此类数据以及 BEFORE UPDATE TRIGGER 以在运行时实际记录信息。要停止回滚数据并因此撤消记录的信息 OR FAIL 需要使用。

重要的是更新不会被回滚,更新将被应用。建议在测试数据库上使用上述内容。

-- 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 次更新柜台 专栏
  • 更改前的 File 列中的值最后文件_之前 柱子。
  • File 列将在 **lastfile_after* 列中更新为的值。
  • MGOFile 表中行的最后一个 rowid(失败)(这确实假设 MGOFile 表不是使用 WITHOUT ROWID 定义的表)。
  • 如果表是用 WITHOUT 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-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
  • lastfile_after
  • T:\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.x27
  • id_of_the_row
  • 6

  • 在上面的人为示例中,可以很容易地确定问题(尽管重复搜索也发现了相同的问题),因为错误位于第 6 行和包含 mkv.so2e09.web.x278-tbs[eztv] 的行。但被 .mkv.so2e09.web.x27 的更新截断因此它是具有 .mkv.so2e09.web.x277-tbs[eztv] 的第 5 行的副本但也被截断为 .mkv.so2e09.web.x27 .

    附言您是否尝试过仅使用
    UPDATE MGOFile
    SET File = 'T:\' || substr(File, 8)
    WHERE File like 'M:\_TV%';

    即删除截断。

    关于sql - 使用 SQL 用另外 3 个字符更新字符串的前 7 个字符,抛出 "Error 19 - UNIQUE constraint failed: MGOFile.File.",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56374968/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com