替换 SQLite 数据库中的路径字符串会导致意外违反唯一约束
Replace path string in SQLite DB causes unexpected violated unique constraint
我不确定我是否发现了 SQLite 中的错误,或者我是否没有正确使用它。我将相对文件路径(正如您从 UNIX 文件系统中了解到的那样)存储在数据库中。为了安全起见,我将该列标记为唯一。
下面是一个不言自明的示例,其中最后一条命令因违反 UNIQUE 约束而意外失败。我的目标是将路径 "a" 的目录重命名为 "d"
CREATE TABLE test (db_id INTEGER PRIMARY KEY, path TEXT UNIQUE);
INSERT INTO test (path) VALUES ('a');
INSERT INTO test (path) VALUES ('a/d/a');
INSERT INTO test (path) VALUES ('a/d');
INSERT INTO test (path) VALUES ('a/d/c');
INSERT INTO test (path) VALUES ('a/a');
INSERT INTO test (path) VALUES ('a/c');
INSERT INTO test (path) VALUES ('a/a/a');
UPDATE test SET path = 'd' WHERE db_id = 1;
UPDATE test SET path = replace(path, 'a/', 'd/') WHERE path GLOB 'a/*'
欢迎任何想法。
我正在使用 SQlite v2.6.0.
INSERT INTO test (path) VALUES ('a/d/a');
INSERT INTO test (path) VALUES ('a/a/a');
将a/
替换为d/
后,两个值都是d/d/a
。
如果只想更改字符串开头的 a/
,则不能使用 replace()
:
UPDATE test
SET path = 'd/' || substr(path, 3)
WHERE path GLOB 'a/*';
我不确定我是否发现了 SQLite 中的错误,或者我是否没有正确使用它。我将相对文件路径(正如您从 UNIX 文件系统中了解到的那样)存储在数据库中。为了安全起见,我将该列标记为唯一。
下面是一个不言自明的示例,其中最后一条命令因违反 UNIQUE 约束而意外失败。我的目标是将路径 "a" 的目录重命名为 "d"
CREATE TABLE test (db_id INTEGER PRIMARY KEY, path TEXT UNIQUE);
INSERT INTO test (path) VALUES ('a');
INSERT INTO test (path) VALUES ('a/d/a');
INSERT INTO test (path) VALUES ('a/d');
INSERT INTO test (path) VALUES ('a/d/c');
INSERT INTO test (path) VALUES ('a/a');
INSERT INTO test (path) VALUES ('a/c');
INSERT INTO test (path) VALUES ('a/a/a');
UPDATE test SET path = 'd' WHERE db_id = 1;
UPDATE test SET path = replace(path, 'a/', 'd/') WHERE path GLOB 'a/*'
欢迎任何想法。 我正在使用 SQlite v2.6.0.
INSERT INTO test (path) VALUES ('a/d/a');
INSERT INTO test (path) VALUES ('a/a/a');
将a/
替换为d/
后,两个值都是d/d/a
。
如果只想更改字符串开头的 a/
,则不能使用 replace()
:
UPDATE test
SET path = 'd/' || substr(path, 3)
WHERE path GLOB 'a/*';