Я использую расширение 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;