Можно ли создать уникальное ограничение, включающее весь путь поля дерева? - PullRequest
0 голосов
/ 20 февраля 2020

Я использую расширение ltree в Postgres для управления путями для дерева. Я хочу убедиться, что поле имени уникально для любого заданного пути в дереве. Могу ли я выполнить sh это, используя ограничение, или мне нужно встроить это в запрос?

  demo table
------------------------------
| name (text) | path (ltree) |
------------------------------
| a           | 1            |
------------------------------
| b           | 1.2          |
------------------------------
| b           | 1.3          |
------------------------------
| b           | 1.2.4        | <-- this should fail on insert
------------------------------

Если мне нужно встроить его в запрос, может ли это иметь условие гонки, если я использую ЧИТАЙТЕ СОВЕРШЕНО?

CREATE TABLE demo (
    name text NOT null,
    path ltree NOT null
);
CREATE INDEX path_gist_idx ON demo USING GIST (path);
INSERT INTO demo (name, path)
SELECT 'a', '1'
WHERE NOT EXISTS (
    SELECT * FROM demo WHERE name = 'a' AND (path <@ '1' OR path @> '1')
);
INSERT INTO demo (name, path)
SELECT 'b', '1.2'
WHERE NOT EXISTS (
    SELECT * FROM demo WHERE name = 'b' AND (path <@ '1.2' OR path @> '1.2')
);
INSERT INTO demo (name, path)
SELECT 'b', '1.3'
WHERE NOT EXISTS (
    SELECT * FROM demo WHERE name = 'b' AND (path <@ '1.3' OR path @> '1.3')
);
INSERT INTO demo (name, path)
SELECT 'b', '1.2.4'
WHERE NOT EXISTS (
    SELECT * FROM demo WHERE name = 'b' AND (path <@ '1.2.4' OR path @> '1.2.4')
);
SELECT * FROM demo;

1 Ответ

0 голосов
/ 20 февраля 2020

Если вы используете чтение, то существует состояние гонки.

В принципе, вы можете использовать ограничение EXCLUDE, за исключением того, что вы не можете использовать ни одного самокоммутативного оператора. Это означает, что вам придется изобрести новый оператор, возможно, с именем <@>, и добавить его в ltree. Я думаю, что это было бы возможно, но не то, что вы, вероятно, с нетерпением ожидаете сделать.

Не могли бы вы просто использовать сериализуемый?

...