Замена строки пути в БД SQLite вызывает неожиданное нарушение уникального ограничения - PullRequest
0 голосов
/ 03 мая 2018

Я не уверен, нашел ли я ошибку в 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.

1 Ответ

0 голосов
/ 03 мая 2018
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/*';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...